Loading src/java/com/android/internal/telephony/data/AccessNetworksManager.java +18 −0 Original line number Diff line number Diff line Loading @@ -406,6 +406,24 @@ public class AccessNetworksManager extends Handler { } bindQualifiedNetworksService(); } if (phone.isUsingNewDataStack()) { // Using post to delay the registering because data retry manager instance is created // later than access networks manager. post(() -> mPhone.getDataNetworkController().getDataRetryManager().registerCallback( new DataRetryManager.DataRetryManagerCallback(this::post) { @Override public void onThrottleStatusChanged(List<ThrottleStatus> throttleStatuses) { try { logl("onThrottleStatusChanged: " + throttleStatuses); mIQualifiedNetworksService.reportThrottleStatusChanged( mPhone.getPhoneId(), throttleStatuses); } catch (Exception ex) { loge("onThrottleStatusChanged: ", ex); } } })); } } /** Loading src/java/com/android/internal/telephony/data/DataEvaluation.java +3 −1 Original line number Diff line number Diff line Loading @@ -223,7 +223,9 @@ public class DataEvaluation { /** Device is currently in an emergency call. */ EMERGENCY_CALL(true), /** There is already a retry setup scheduled for this data profile. */ RETRY_SCHEDULED(true); RETRY_SCHEDULED(true), /** Network has explicitly request to throttle setup attempt. */ DATA_THROTTLED(true); private final boolean mIsHardReason; Loading src/java/com/android/internal/telephony/data/DataNetwork.java +1 −3 Original line number Diff line number Diff line Loading @@ -2039,9 +2039,7 @@ public class DataNetwork extends StateMachine { mDataServiceManagers.get(mTransport).deactivateDataCall(mCid.get(mTransport), DataService.REQUEST_REASON_HANDOVER, null); // Switch the transport to the target. mTransport = mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN ? AccessNetworkConstants.TRANSPORT_TYPE_WLAN : AccessNetworkConstants.TRANSPORT_TYPE_WWAN; mTransport = DataUtils.getTargetTransport(mTransport); updateDataNetwork(response); if (retryEntry != null) retryEntry.setState(DataRetryEntry.RETRY_STATE_SUCCEEDED); mDataNetworkCallback.invokeFromExecutor( Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +18 −6 Original line number Diff line number Diff line Loading @@ -688,7 +688,8 @@ public class DataNetworkController extends Handler { DataNetworkController.this.onDataStallReestablishInternet(); } }); mDataRetryManager = new DataRetryManager(mPhone, this, looper, mDataRetryManager = new DataRetryManager(mPhone, this, mDataServiceManagers, looper, new DataRetryManagerCallback(this::post) { @Override public void onDataNetworkSetupRetry( Loading Loading @@ -1132,6 +1133,8 @@ public class DataNetworkController extends Handler { // 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. evaluation.addDataDisallowedReason(DataDisallowedReason.RETRY_SCHEDULED); } else if (mDataRetryManager.isDataProfileThrottled(dataProfile)) { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_THROTTLED); } if (evaluation.isDataAllowed()) { Loading Loading @@ -1865,6 +1868,7 @@ public class DataNetworkController extends Handler { + DataFailCause.toString(cause) + "(" + cause + ")"); mDataNetworkList.remove(dataNetwork); mPendingImsDeregDataNetworks.remove(dataNetwork); mDataRetryManager.cancelPendingHandoverRetry(dataNetwork); updateOverallInternetDataState(); if (dataNetwork.getNetworkCapabilities().hasCapability( Loading Loading @@ -1930,11 +1934,13 @@ public class DataNetworkController extends Handler { } else if (handoverFailureMode == DataCallResponse .HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_SETUP_NORMAL || handoverFailureMode == DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY) { // Tear down the data network on source transport. After disconnected, a new data // network will be brought up on the target transport. int targetTransport = DataUtils.getTargetTransport(dataNetwork.getTransport()); mDataRetryManager.evaluateDataSetupRetry(dataNetwork.getDataProfile(), targetTransport, dataNetwork.getAttachedNetworkRequestList(), cause, retryDelayMillis); // Tear down the data network on source transport. Retry manager will schedule // setup a new data network on the target transport. tearDownGracefully(dataNetwork, DataNetwork.TEAR_DOWN_REASON_HANDOVER_FAILED); } else { // Delegate to data retry manager to evaluate if handover retry should be performed. mDataRetryManager.evaluateDataHandoverRetry(dataNetwork, cause, retryDelayMillis); } } Loading Loading @@ -1985,8 +1991,7 @@ public class DataNetworkController extends Handler { } } } else { // reset throttling after binding to data service // mDataThrottler.reset(); mDataRetryManager.reset(); } mDataServiceBound.put(transport, bound); } Loading Loading @@ -2226,6 +2231,13 @@ public class DataNetworkController extends Handler { return mDataSettingsManager; } /** * @return Data retry manager instance. */ public @NonNull DataRetryManager getDataRetryManager() { return mDataRetryManager; } /** * Get data network type based on transport. * Loading src/java/com/android/internal/telephony/data/DataProfileManager.java +26 −8 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.telephony.data.DataProfile; import android.telephony.data.TrafficDescriptor; import android.util.ArraySet; import android.util.IndentingPrintWriter; import android.util.LocalLog; Loading @@ -46,6 +47,7 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.concurrent.Executor; import java.util.stream.Collectors; Loading Loading @@ -91,8 +93,9 @@ public class DataProfileManager extends Handler { /** Preferred data profile set id. */ private int mPreferredDataProfileSetId = Telephony.Carriers.NO_APN_SET_ID; /** Data profile manager callback. */ private final @NonNull DataProfileManagerCallback mDataProfileManagerCallback; /** Data profile manager callbacks. */ private final @NonNull Set<DataProfileManagerCallback> mDataProfileManagerCallbacks = new ArraySet<>(); /** * Data profile manager callback. This should be only used by {@link DataNetworkController}. Loading Loading @@ -134,7 +137,7 @@ public class DataProfileManager extends Handler { mWwanDataServiceManager = dataServiceManager; mDataConfigManager = dataNetworkController.getDataConfigManager(); mAccessNetworksManager = phone.getAccessNetworksManager(); mDataProfileManagerCallback = callback; mDataProfileManagerCallbacks.add(callback); registerAllEvents(); } Loading Loading @@ -247,8 +250,8 @@ public class DataProfileManager extends Handler { log("Data profiles changed."); mAllDataProfiles.clear(); mAllDataProfiles.addAll(profiles); mDataProfileManagerCallback.invokeFromExecutor( mDataProfileManagerCallback::onDataProfilesChanged); mDataProfileManagerCallbacks.forEach(callback -> callback.invokeFromExecutor( callback::onDataProfilesChanged)); } mPreferredDataProfileSetId = getPreferredDataProfileSetId(); Loading Loading @@ -429,9 +432,6 @@ public class DataProfileManager extends Handler { return null; } // TODO: Need a lot more works here. // 1. Should consider data throttling. return dataProfiles.get(0); } Loading @@ -450,6 +450,24 @@ public class DataProfileManager extends Handler { .collect(Collectors.toList()); } /** * Register the callback for receiving information from {@link DataProfileManager}. * * @param callback The callback. */ public void registerCallback(@NonNull DataProfileManagerCallback callback) { mDataProfileManagerCallbacks.add(callback); } /** * Unregister the previously registered {@link DataProfileManagerCallback}. * * @param callback The callback to unregister. */ public void unregisterCallback(@NonNull DataProfileManagerCallback callback) { mDataProfileManagerCallbacks.remove(callback); } /** * Log debug messages. * @param s debug messages Loading Loading
src/java/com/android/internal/telephony/data/AccessNetworksManager.java +18 −0 Original line number Diff line number Diff line Loading @@ -406,6 +406,24 @@ public class AccessNetworksManager extends Handler { } bindQualifiedNetworksService(); } if (phone.isUsingNewDataStack()) { // Using post to delay the registering because data retry manager instance is created // later than access networks manager. post(() -> mPhone.getDataNetworkController().getDataRetryManager().registerCallback( new DataRetryManager.DataRetryManagerCallback(this::post) { @Override public void onThrottleStatusChanged(List<ThrottleStatus> throttleStatuses) { try { logl("onThrottleStatusChanged: " + throttleStatuses); mIQualifiedNetworksService.reportThrottleStatusChanged( mPhone.getPhoneId(), throttleStatuses); } catch (Exception ex) { loge("onThrottleStatusChanged: ", ex); } } })); } } /** Loading
src/java/com/android/internal/telephony/data/DataEvaluation.java +3 −1 Original line number Diff line number Diff line Loading @@ -223,7 +223,9 @@ public class DataEvaluation { /** Device is currently in an emergency call. */ EMERGENCY_CALL(true), /** There is already a retry setup scheduled for this data profile. */ RETRY_SCHEDULED(true); RETRY_SCHEDULED(true), /** Network has explicitly request to throttle setup attempt. */ DATA_THROTTLED(true); private final boolean mIsHardReason; Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +1 −3 Original line number Diff line number Diff line Loading @@ -2039,9 +2039,7 @@ public class DataNetwork extends StateMachine { mDataServiceManagers.get(mTransport).deactivateDataCall(mCid.get(mTransport), DataService.REQUEST_REASON_HANDOVER, null); // Switch the transport to the target. mTransport = mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN ? AccessNetworkConstants.TRANSPORT_TYPE_WLAN : AccessNetworkConstants.TRANSPORT_TYPE_WWAN; mTransport = DataUtils.getTargetTransport(mTransport); updateDataNetwork(response); if (retryEntry != null) retryEntry.setState(DataRetryEntry.RETRY_STATE_SUCCEEDED); mDataNetworkCallback.invokeFromExecutor( Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +18 −6 Original line number Diff line number Diff line Loading @@ -688,7 +688,8 @@ public class DataNetworkController extends Handler { DataNetworkController.this.onDataStallReestablishInternet(); } }); mDataRetryManager = new DataRetryManager(mPhone, this, looper, mDataRetryManager = new DataRetryManager(mPhone, this, mDataServiceManagers, looper, new DataRetryManagerCallback(this::post) { @Override public void onDataNetworkSetupRetry( Loading Loading @@ -1132,6 +1133,8 @@ public class DataNetworkController extends Handler { // 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. evaluation.addDataDisallowedReason(DataDisallowedReason.RETRY_SCHEDULED); } else if (mDataRetryManager.isDataProfileThrottled(dataProfile)) { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_THROTTLED); } if (evaluation.isDataAllowed()) { Loading Loading @@ -1865,6 +1868,7 @@ public class DataNetworkController extends Handler { + DataFailCause.toString(cause) + "(" + cause + ")"); mDataNetworkList.remove(dataNetwork); mPendingImsDeregDataNetworks.remove(dataNetwork); mDataRetryManager.cancelPendingHandoverRetry(dataNetwork); updateOverallInternetDataState(); if (dataNetwork.getNetworkCapabilities().hasCapability( Loading Loading @@ -1930,11 +1934,13 @@ public class DataNetworkController extends Handler { } else if (handoverFailureMode == DataCallResponse .HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_SETUP_NORMAL || handoverFailureMode == DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY) { // Tear down the data network on source transport. After disconnected, a new data // network will be brought up on the target transport. int targetTransport = DataUtils.getTargetTransport(dataNetwork.getTransport()); mDataRetryManager.evaluateDataSetupRetry(dataNetwork.getDataProfile(), targetTransport, dataNetwork.getAttachedNetworkRequestList(), cause, retryDelayMillis); // Tear down the data network on source transport. Retry manager will schedule // setup a new data network on the target transport. tearDownGracefully(dataNetwork, DataNetwork.TEAR_DOWN_REASON_HANDOVER_FAILED); } else { // Delegate to data retry manager to evaluate if handover retry should be performed. mDataRetryManager.evaluateDataHandoverRetry(dataNetwork, cause, retryDelayMillis); } } Loading Loading @@ -1985,8 +1991,7 @@ public class DataNetworkController extends Handler { } } } else { // reset throttling after binding to data service // mDataThrottler.reset(); mDataRetryManager.reset(); } mDataServiceBound.put(transport, bound); } Loading Loading @@ -2226,6 +2231,13 @@ public class DataNetworkController extends Handler { return mDataSettingsManager; } /** * @return Data retry manager instance. */ public @NonNull DataRetryManager getDataRetryManager() { return mDataRetryManager; } /** * Get data network type based on transport. * Loading
src/java/com/android/internal/telephony/data/DataProfileManager.java +26 −8 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.telephony.data.DataProfile; import android.telephony.data.TrafficDescriptor; import android.util.ArraySet; import android.util.IndentingPrintWriter; import android.util.LocalLog; Loading @@ -46,6 +47,7 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.concurrent.Executor; import java.util.stream.Collectors; Loading Loading @@ -91,8 +93,9 @@ public class DataProfileManager extends Handler { /** Preferred data profile set id. */ private int mPreferredDataProfileSetId = Telephony.Carriers.NO_APN_SET_ID; /** Data profile manager callback. */ private final @NonNull DataProfileManagerCallback mDataProfileManagerCallback; /** Data profile manager callbacks. */ private final @NonNull Set<DataProfileManagerCallback> mDataProfileManagerCallbacks = new ArraySet<>(); /** * Data profile manager callback. This should be only used by {@link DataNetworkController}. Loading Loading @@ -134,7 +137,7 @@ public class DataProfileManager extends Handler { mWwanDataServiceManager = dataServiceManager; mDataConfigManager = dataNetworkController.getDataConfigManager(); mAccessNetworksManager = phone.getAccessNetworksManager(); mDataProfileManagerCallback = callback; mDataProfileManagerCallbacks.add(callback); registerAllEvents(); } Loading Loading @@ -247,8 +250,8 @@ public class DataProfileManager extends Handler { log("Data profiles changed."); mAllDataProfiles.clear(); mAllDataProfiles.addAll(profiles); mDataProfileManagerCallback.invokeFromExecutor( mDataProfileManagerCallback::onDataProfilesChanged); mDataProfileManagerCallbacks.forEach(callback -> callback.invokeFromExecutor( callback::onDataProfilesChanged)); } mPreferredDataProfileSetId = getPreferredDataProfileSetId(); Loading Loading @@ -429,9 +432,6 @@ public class DataProfileManager extends Handler { return null; } // TODO: Need a lot more works here. // 1. Should consider data throttling. return dataProfiles.get(0); } Loading @@ -450,6 +450,24 @@ public class DataProfileManager extends Handler { .collect(Collectors.toList()); } /** * Register the callback for receiving information from {@link DataProfileManager}. * * @param callback The callback. */ public void registerCallback(@NonNull DataProfileManagerCallback callback) { mDataProfileManagerCallbacks.add(callback); } /** * Unregister the previously registered {@link DataProfileManagerCallback}. * * @param callback The callback to unregister. */ public void unregisterCallback(@NonNull DataProfileManagerCallback callback) { mDataProfileManagerCallbacks.remove(callback); } /** * Log debug messages. * @param s debug messages Loading