Loading src/java/com/android/internal/telephony/data/DataNetwork.java +15 −0 Original line number Diff line number Diff line Loading @@ -1438,6 +1438,21 @@ public class DataNetwork extends StateMachine { return TelephonyManager.DATA_UNKNOWN; } /** * @return {@code true} if this data network supports internet. */ public boolean isInternet() { return mNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && mNetworkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) && mNetworkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_TRUSTED) && mNetworkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED) && mNetworkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_VPN); } /** * Get precise data connection state * Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +66 −36 Original line number Diff line number Diff line Loading @@ -29,12 +29,12 @@ import android.os.AsyncResult; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.RegistrantList; import android.telephony.AccessNetworkConstants; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.Annotation.DataFailureCause; import android.telephony.Annotation.NetCapability; import android.telephony.Annotation.NetworkType; import android.telephony.Annotation.ValidationStatus; import android.telephony.NetworkRegistrationInfo; import android.telephony.NetworkRegistrationInfo.RegistrationState; import android.telephony.ServiceState; Loading Loading @@ -95,26 +95,23 @@ public class DataNetworkController extends Handler { /** Re-evaluate all unsatisfied network requests. */ private static final int EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS = 5; /** Event for data stall action reestablish. */ private static final int EVENT_DATA_STALL_ACTION_REESTABLISH = 6; /** Event for packet switch restricted enabled by network. */ private static final int EVENT_PS_RESTRICT_ENABLED = 7; private static final int EVENT_PS_RESTRICT_ENABLED = 6; /** Event for packet switch restricted disabled by network. */ private static final int EVENT_PS_RESTRICT_DISABLED = 8; private static final int EVENT_PS_RESTRICT_DISABLED = 7; /** Event for data service binding changed. */ private static final int EVENT_DATA_SERVICE_BINDING_CHANGED = 9; private static final int EVENT_DATA_SERVICE_BINDING_CHANGED = 8; /** Event for SIM state changed. */ private static final int EVENT_SIM_STATE_CHANGED = 10; private static final int EVENT_SIM_STATE_CHANGED = 9; /** Event for data profile changed. */ private static final int EVENT_DATA_PROFILES_CHANGED = 11; private static final int EVENT_DATA_PROFILES_CHANGED = 10; /** Event for data retry. */ private static final int EVENT_DATA_RETRY = 12; private static final int EVENT_DATA_RETRY = 11; private final Phone mPhone; private final String mLogTag; Loading Loading @@ -146,10 +143,10 @@ public class DataNetworkController extends Handler { private final @NonNull List<DataNetwork> mHistoricalDataNetworkList = new ArrayList<>(); /** * Registrant list for internet validation status changed. * Data network controller callback. Used for listening events from data network controller. */ private final @NonNull RegistrantList mInternetValidationStatusRegistrants = new RegistrantList(); private final @NonNull List<DataNetworkControllerCallback> mDataNetworkControllerCallbacks = new ArrayList<>(); /** Indicates if packet switch data is restricted by the network. */ private boolean mPsRestricted = false; Loading Loading @@ -293,6 +290,26 @@ public class DataNetworkController extends Handler { } } /** * The data network controller callback. Note this is only used for passing information * internally in the data stack, should not be used externally. */ interface DataNetworkControllerCallback { /** * Called when internet data network validation status changed. * * @param validationStatus The validation status. */ default void onInternetDataNetworkValidationStatusChanged( @ValidationStatus int validationStatus) {} /** Called when internet data network is connected. */ default void onInternetDataNetworkConnected() {} /** Called when internet data network is disconnected. */ default void onInternetDataNetworkDisconnected() {} } /** * Constructor * Loading @@ -319,7 +336,8 @@ public class DataNetworkController extends Handler { mDataProfileManager = new DataProfileManager(mPhone, this, mDataServiceManagers .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), looper); mDataStallRecoveryManager = new DataStallRecoveryManager(mPhone, this, mDataServiceManagers .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), looper); .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), looper, () -> post(this::onDataStallReestablishInternet)); mDataRetryManager = new DataRetryManager(mPhone, this, looper); registerAllEvents(); Loading @@ -337,8 +355,6 @@ public class DataNetworkController extends Handler { mDataRetryManager.registerForDataRetryCallback(dataRetryEntry -> sendMessage(obtainMessage(EVENT_DATA_RETRY, dataRetryEntry))); mDataConfigManager.registerForConfigUpdate(this, EVENT_DATA_CONFIG_UPDATED); mDataStallRecoveryManager.registerForDataStallReestablishEvent(this, EVENT_DATA_STALL_ACTION_REESTABLISH); mDataProfileManager.registerForDataProfilesChanged(this, EVENT_DATA_PROFILES_CHANGED); mPhone.getServiceStateTracker().registerForPsRestrictedEnabled(this, EVENT_PS_RESTRICT_ENABLED, null); Loading Loading @@ -371,9 +387,6 @@ public class DataNetworkController extends Handler { case EVENT_REMOVE_NETWORK_REQUEST: onRemoveNetworkRequest((NetworkRequest) msg.obj); break; case EVENT_DATA_STALL_ACTION_REESTABLISH: onDataStallActionReestablish(); break; case EVENT_PS_RESTRICT_ENABLED: mPsRestricted = true; break; Loading Loading @@ -872,7 +885,10 @@ public class DataNetworkController extends Handler { * @param dataNetwork The data network. */ private void onDataNetworkConnected(@NonNull DataNetwork dataNetwork) { if (dataNetwork.isInternet()) { mDataNetworkControllerCallbacks.forEach( DataNetworkControllerCallback::onInternetDataNetworkConnected); } } /** Loading @@ -892,15 +908,10 @@ public class DataNetworkController extends Handler { } // TODO: Add DataConfigManager.isRecoveryOnBadNetworkEnabled() NetworkCapabilities nc = dataNetwork.getNetworkCapabilities(); if (nc != null && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)) { mInternetValidationStatusRegistrants.notifyResult( dataValidationResult.getValidationStatus()); if (dataNetwork.isInternet()) { mDataNetworkControllerCallbacks.forEach(callback -> callback.onInternetDataNetworkValidationStatusChanged( dataValidationResult.getValidationStatus())); } } Loading @@ -925,6 +936,11 @@ public class DataNetworkController extends Handler { @DataFailureCause int cause) { // TODO: Should perform retry here. if (dataNetwork.isInternet()) { mDataNetworkControllerCallbacks.forEach( DataNetworkControllerCallback::onInternetDataNetworkDisconnected); } mDataNetworkList.remove(dataNetwork); } Loading @@ -940,9 +956,11 @@ public class DataNetworkController extends Handler { } /** * Handle data stall action reestablish event. * Called when data stall occurs and needed to tear down / setup a new data network for * internet. This event is from {@link DataStallRecoveryManager}. */ private void onDataStallActionReestablish() { private void onDataStallReestablishInternet() { log("onDataStallReestablishInternet"); } /** Loading Loading @@ -1037,13 +1055,25 @@ public class DataNetworkController extends Handler { } /** * Register for internet data network validation status changed event. * Register data network controller callback. * * @param callback The callback. */ public void registerDataNetworkControllerCallback( @NonNull DataNetworkControllerCallback callback) { if (!mDataNetworkControllerCallbacks.contains(callback)) { mDataNetworkControllerCallbacks.add(callback); } } /** * Unregister data network controller callback. * * @param handler The handler to handle the event. * @param what The event. * @param callback The callback. */ public void registerForInternetValidationStatusChanged(@NonNull Handler handler, int what) { mInternetValidationStatusRegistrants.addUnique(handler, what, null); public void unregisterDataNetworkControllerCallback( @NonNull DataNetworkControllerCallback callback) { mDataNetworkControllerCallbacks.remove(callback); } /** Loading src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java +56 −22 Original line number Diff line number Diff line Loading @@ -23,13 +23,11 @@ import android.content.Intent; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; import android.net.Network; import android.os.AsyncResult; import android.os.AsyncTask; import android.os.Handler; import android.os.HandlerExecutor; import android.os.Looper; import android.os.Message; import android.os.RegistrantList; import android.provider.Settings; import android.telephony.Annotation.ValidationStatus; import android.telephony.PreciseDataConnectionState; Loading @@ -41,6 +39,7 @@ import android.util.IndentingPrintWriter; import android.util.LocalLog; import com.android.internal.telephony.Phone; import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback; import com.android.telephony.Rlog; import java.io.FileDescriptor; Loading Loading @@ -75,6 +74,12 @@ public class DataStallRecoveryManager extends Handler { /** Event for internet validation status changed. */ private static final int EVENT_INTERNET_VALIDATION_STATUS_CHANGED = 2; /** Event for internet data network connected. */ private static final int EVENT_INTERNET_CONNECTED = 3; /** Event for internet data network disconnected. */ private static final int EVENT_INTERNET_DISCONNECTED = 4; private final @NonNull Phone mPhone; private final @NonNull String mLogTag; private final @NonNull LocalLog mLocalLog = new LocalLog(128); Loading @@ -100,29 +105,44 @@ public class DataStallRecoveryManager extends Handler { /** Telephony Manager */ private TelephonyManager mTelephonyManager; /** The RegistrantList for recovery action reestablish. */ private final RegistrantList mDataStallReestablishRegistrants = new RegistrantList(); /** Listening the callback from TelephonyCallback. */ private TelephonyStateListener mTelephonyStateListener; private @NonNull DataStallRecoveryManagerCallback mDataStallRecoveryManagerCallback; /** * The data stall recovery manager callback. Note this is only used for passing information * internally in the data stack, should not be used externally. */ interface DataStallRecoveryManagerCallback { /** * Called when data stall occurs and needed to tear down / setup a new data network for * internet. */ void onDataStallReestablishInternet(); } /** * Constructor * * @param phone The phone instance. * @param dataNetworkController Data network controller * @param dataServiceManager The WWAN data service manager. * @param looper The looper to be used by the handler. Currently the handler thread is the * phone process's main thread. * @param callback Callback to notify data network controller for data stall events. */ public DataStallRecoveryManager(@NonNull Phone phone, @NonNull DataNetworkController dataNetworkController, @NonNull DataServiceManager dataServiceManager, @NonNull Looper looper) { @NonNull DataServiceManager dataServiceManager, @NonNull Looper looper, @NonNull DataStallRecoveryManagerCallback callback) { super(looper); mPhone = phone; mLogTag = "DSTMTR-" + mPhone.getPhoneId(); mDataNetworkController = dataNetworkController; mWwanDataServiceManager = dataServiceManager; mDataConfigManager = mDataNetworkController.getDataConfigManager(); mDataStallRecoveryManagerCallback = callback; mResolver = mPhone.getContext().getContentResolver(); mTelephonyManager = mPhone.getContext().getSystemService(TelephonyManager.class); mConnectivityManager = mPhone.getContext().getSystemService(ConnectivityManager.class); Loading @@ -134,8 +154,25 @@ public class DataStallRecoveryManager extends Handler { /** Register for all events that data stall monitor is interested. */ private void registerAllEvents() { mDataConfigManager.registerForConfigUpdate(this, EVENT_DATA_CONFIG_UPDATED); mDataNetworkController.registerForInternetValidationStatusChanged(this, EVENT_INTERNET_VALIDATION_STATUS_CHANGED); mDataNetworkController.registerDataNetworkControllerCallback( new DataNetworkControllerCallback() { @Override public void onInternetDataNetworkValidationStatusChanged( @ValidationStatus int validationStatus) { sendMessage(obtainMessage(EVENT_INTERNET_VALIDATION_STATUS_CHANGED, validationStatus, 0)); } @Override public void onInternetDataNetworkConnected() { sendEmptyMessage(EVENT_INTERNET_CONNECTED); } @Override public void onInternetDataNetworkDisconnected() { sendEmptyMessage(EVENT_INTERNET_DISCONNECTED); } }); mTelephonyManager.registerTelephonyCallback( new HandlerExecutor(this), mTelephonyStateListener); } Loading Loading @@ -170,9 +207,16 @@ public class DataStallRecoveryManager extends Handler { onDataConfigUpdated(); break; case EVENT_INTERNET_VALIDATION_STATUS_CHANGED: AsyncResult ar = (AsyncResult) msg.obj; int validationStatus = (int) ar.result; onInternetValidationStatusChanged(validationStatus); onInternetValidationStatusChanged(msg.arg1); break; case EVENT_INTERNET_CONNECTED: // handle internet connected event. break; case EVENT_INTERNET_DISCONNECTED: // handle internet disconnected event. break; default: loge("Unexpected message " + msg); break; } } Loading @@ -192,16 +236,6 @@ public class DataStallRecoveryManager extends Handler { } /** * Register for data stall reestablish event. * * @param handler The handler to handle the event. * @param what The event. */ public void registerForDataStallReestablishEvent(@NonNull Handler handler, int what) { mDataStallReestablishRegistrants.addUnique(handler, what, null); } /** Get recovery action from settings. */ @RecoveryAction private int getRecoveryAction() { Loading Loading @@ -262,7 +296,7 @@ public class DataStallRecoveryManager extends Handler { return; } log("cleanUpDataCall: notify clean up data call"); mDataStallReestablishRegistrants.notifyRegistrants(); mDataStallRecoveryManagerCallback.onDataStallReestablishInternet(); } /** Recovery Action: RECOVERY_ACTION_RADIO_RESTART */ Loading Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +15 −0 Original line number Diff line number Diff line Loading @@ -1438,6 +1438,21 @@ public class DataNetwork extends StateMachine { return TelephonyManager.DATA_UNKNOWN; } /** * @return {@code true} if this data network supports internet. */ public boolean isInternet() { return mNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && mNetworkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) && mNetworkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_TRUSTED) && mNetworkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED) && mNetworkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_VPN); } /** * Get precise data connection state * Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +66 −36 Original line number Diff line number Diff line Loading @@ -29,12 +29,12 @@ import android.os.AsyncResult; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.RegistrantList; import android.telephony.AccessNetworkConstants; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.Annotation.DataFailureCause; import android.telephony.Annotation.NetCapability; import android.telephony.Annotation.NetworkType; import android.telephony.Annotation.ValidationStatus; import android.telephony.NetworkRegistrationInfo; import android.telephony.NetworkRegistrationInfo.RegistrationState; import android.telephony.ServiceState; Loading Loading @@ -95,26 +95,23 @@ public class DataNetworkController extends Handler { /** Re-evaluate all unsatisfied network requests. */ private static final int EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS = 5; /** Event for data stall action reestablish. */ private static final int EVENT_DATA_STALL_ACTION_REESTABLISH = 6; /** Event for packet switch restricted enabled by network. */ private static final int EVENT_PS_RESTRICT_ENABLED = 7; private static final int EVENT_PS_RESTRICT_ENABLED = 6; /** Event for packet switch restricted disabled by network. */ private static final int EVENT_PS_RESTRICT_DISABLED = 8; private static final int EVENT_PS_RESTRICT_DISABLED = 7; /** Event for data service binding changed. */ private static final int EVENT_DATA_SERVICE_BINDING_CHANGED = 9; private static final int EVENT_DATA_SERVICE_BINDING_CHANGED = 8; /** Event for SIM state changed. */ private static final int EVENT_SIM_STATE_CHANGED = 10; private static final int EVENT_SIM_STATE_CHANGED = 9; /** Event for data profile changed. */ private static final int EVENT_DATA_PROFILES_CHANGED = 11; private static final int EVENT_DATA_PROFILES_CHANGED = 10; /** Event for data retry. */ private static final int EVENT_DATA_RETRY = 12; private static final int EVENT_DATA_RETRY = 11; private final Phone mPhone; private final String mLogTag; Loading Loading @@ -146,10 +143,10 @@ public class DataNetworkController extends Handler { private final @NonNull List<DataNetwork> mHistoricalDataNetworkList = new ArrayList<>(); /** * Registrant list for internet validation status changed. * Data network controller callback. Used for listening events from data network controller. */ private final @NonNull RegistrantList mInternetValidationStatusRegistrants = new RegistrantList(); private final @NonNull List<DataNetworkControllerCallback> mDataNetworkControllerCallbacks = new ArrayList<>(); /** Indicates if packet switch data is restricted by the network. */ private boolean mPsRestricted = false; Loading Loading @@ -293,6 +290,26 @@ public class DataNetworkController extends Handler { } } /** * The data network controller callback. Note this is only used for passing information * internally in the data stack, should not be used externally. */ interface DataNetworkControllerCallback { /** * Called when internet data network validation status changed. * * @param validationStatus The validation status. */ default void onInternetDataNetworkValidationStatusChanged( @ValidationStatus int validationStatus) {} /** Called when internet data network is connected. */ default void onInternetDataNetworkConnected() {} /** Called when internet data network is disconnected. */ default void onInternetDataNetworkDisconnected() {} } /** * Constructor * Loading @@ -319,7 +336,8 @@ public class DataNetworkController extends Handler { mDataProfileManager = new DataProfileManager(mPhone, this, mDataServiceManagers .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), looper); mDataStallRecoveryManager = new DataStallRecoveryManager(mPhone, this, mDataServiceManagers .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), looper); .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), looper, () -> post(this::onDataStallReestablishInternet)); mDataRetryManager = new DataRetryManager(mPhone, this, looper); registerAllEvents(); Loading @@ -337,8 +355,6 @@ public class DataNetworkController extends Handler { mDataRetryManager.registerForDataRetryCallback(dataRetryEntry -> sendMessage(obtainMessage(EVENT_DATA_RETRY, dataRetryEntry))); mDataConfigManager.registerForConfigUpdate(this, EVENT_DATA_CONFIG_UPDATED); mDataStallRecoveryManager.registerForDataStallReestablishEvent(this, EVENT_DATA_STALL_ACTION_REESTABLISH); mDataProfileManager.registerForDataProfilesChanged(this, EVENT_DATA_PROFILES_CHANGED); mPhone.getServiceStateTracker().registerForPsRestrictedEnabled(this, EVENT_PS_RESTRICT_ENABLED, null); Loading Loading @@ -371,9 +387,6 @@ public class DataNetworkController extends Handler { case EVENT_REMOVE_NETWORK_REQUEST: onRemoveNetworkRequest((NetworkRequest) msg.obj); break; case EVENT_DATA_STALL_ACTION_REESTABLISH: onDataStallActionReestablish(); break; case EVENT_PS_RESTRICT_ENABLED: mPsRestricted = true; break; Loading Loading @@ -872,7 +885,10 @@ public class DataNetworkController extends Handler { * @param dataNetwork The data network. */ private void onDataNetworkConnected(@NonNull DataNetwork dataNetwork) { if (dataNetwork.isInternet()) { mDataNetworkControllerCallbacks.forEach( DataNetworkControllerCallback::onInternetDataNetworkConnected); } } /** Loading @@ -892,15 +908,10 @@ public class DataNetworkController extends Handler { } // TODO: Add DataConfigManager.isRecoveryOnBadNetworkEnabled() NetworkCapabilities nc = dataNetwork.getNetworkCapabilities(); if (nc != null && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)) { mInternetValidationStatusRegistrants.notifyResult( dataValidationResult.getValidationStatus()); if (dataNetwork.isInternet()) { mDataNetworkControllerCallbacks.forEach(callback -> callback.onInternetDataNetworkValidationStatusChanged( dataValidationResult.getValidationStatus())); } } Loading @@ -925,6 +936,11 @@ public class DataNetworkController extends Handler { @DataFailureCause int cause) { // TODO: Should perform retry here. if (dataNetwork.isInternet()) { mDataNetworkControllerCallbacks.forEach( DataNetworkControllerCallback::onInternetDataNetworkDisconnected); } mDataNetworkList.remove(dataNetwork); } Loading @@ -940,9 +956,11 @@ public class DataNetworkController extends Handler { } /** * Handle data stall action reestablish event. * Called when data stall occurs and needed to tear down / setup a new data network for * internet. This event is from {@link DataStallRecoveryManager}. */ private void onDataStallActionReestablish() { private void onDataStallReestablishInternet() { log("onDataStallReestablishInternet"); } /** Loading Loading @@ -1037,13 +1055,25 @@ public class DataNetworkController extends Handler { } /** * Register for internet data network validation status changed event. * Register data network controller callback. * * @param callback The callback. */ public void registerDataNetworkControllerCallback( @NonNull DataNetworkControllerCallback callback) { if (!mDataNetworkControllerCallbacks.contains(callback)) { mDataNetworkControllerCallbacks.add(callback); } } /** * Unregister data network controller callback. * * @param handler The handler to handle the event. * @param what The event. * @param callback The callback. */ public void registerForInternetValidationStatusChanged(@NonNull Handler handler, int what) { mInternetValidationStatusRegistrants.addUnique(handler, what, null); public void unregisterDataNetworkControllerCallback( @NonNull DataNetworkControllerCallback callback) { mDataNetworkControllerCallbacks.remove(callback); } /** Loading
src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java +56 −22 Original line number Diff line number Diff line Loading @@ -23,13 +23,11 @@ import android.content.Intent; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; import android.net.Network; import android.os.AsyncResult; import android.os.AsyncTask; import android.os.Handler; import android.os.HandlerExecutor; import android.os.Looper; import android.os.Message; import android.os.RegistrantList; import android.provider.Settings; import android.telephony.Annotation.ValidationStatus; import android.telephony.PreciseDataConnectionState; Loading @@ -41,6 +39,7 @@ import android.util.IndentingPrintWriter; import android.util.LocalLog; import com.android.internal.telephony.Phone; import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback; import com.android.telephony.Rlog; import java.io.FileDescriptor; Loading Loading @@ -75,6 +74,12 @@ public class DataStallRecoveryManager extends Handler { /** Event for internet validation status changed. */ private static final int EVENT_INTERNET_VALIDATION_STATUS_CHANGED = 2; /** Event for internet data network connected. */ private static final int EVENT_INTERNET_CONNECTED = 3; /** Event for internet data network disconnected. */ private static final int EVENT_INTERNET_DISCONNECTED = 4; private final @NonNull Phone mPhone; private final @NonNull String mLogTag; private final @NonNull LocalLog mLocalLog = new LocalLog(128); Loading @@ -100,29 +105,44 @@ public class DataStallRecoveryManager extends Handler { /** Telephony Manager */ private TelephonyManager mTelephonyManager; /** The RegistrantList for recovery action reestablish. */ private final RegistrantList mDataStallReestablishRegistrants = new RegistrantList(); /** Listening the callback from TelephonyCallback. */ private TelephonyStateListener mTelephonyStateListener; private @NonNull DataStallRecoveryManagerCallback mDataStallRecoveryManagerCallback; /** * The data stall recovery manager callback. Note this is only used for passing information * internally in the data stack, should not be used externally. */ interface DataStallRecoveryManagerCallback { /** * Called when data stall occurs and needed to tear down / setup a new data network for * internet. */ void onDataStallReestablishInternet(); } /** * Constructor * * @param phone The phone instance. * @param dataNetworkController Data network controller * @param dataServiceManager The WWAN data service manager. * @param looper The looper to be used by the handler. Currently the handler thread is the * phone process's main thread. * @param callback Callback to notify data network controller for data stall events. */ public DataStallRecoveryManager(@NonNull Phone phone, @NonNull DataNetworkController dataNetworkController, @NonNull DataServiceManager dataServiceManager, @NonNull Looper looper) { @NonNull DataServiceManager dataServiceManager, @NonNull Looper looper, @NonNull DataStallRecoveryManagerCallback callback) { super(looper); mPhone = phone; mLogTag = "DSTMTR-" + mPhone.getPhoneId(); mDataNetworkController = dataNetworkController; mWwanDataServiceManager = dataServiceManager; mDataConfigManager = mDataNetworkController.getDataConfigManager(); mDataStallRecoveryManagerCallback = callback; mResolver = mPhone.getContext().getContentResolver(); mTelephonyManager = mPhone.getContext().getSystemService(TelephonyManager.class); mConnectivityManager = mPhone.getContext().getSystemService(ConnectivityManager.class); Loading @@ -134,8 +154,25 @@ public class DataStallRecoveryManager extends Handler { /** Register for all events that data stall monitor is interested. */ private void registerAllEvents() { mDataConfigManager.registerForConfigUpdate(this, EVENT_DATA_CONFIG_UPDATED); mDataNetworkController.registerForInternetValidationStatusChanged(this, EVENT_INTERNET_VALIDATION_STATUS_CHANGED); mDataNetworkController.registerDataNetworkControllerCallback( new DataNetworkControllerCallback() { @Override public void onInternetDataNetworkValidationStatusChanged( @ValidationStatus int validationStatus) { sendMessage(obtainMessage(EVENT_INTERNET_VALIDATION_STATUS_CHANGED, validationStatus, 0)); } @Override public void onInternetDataNetworkConnected() { sendEmptyMessage(EVENT_INTERNET_CONNECTED); } @Override public void onInternetDataNetworkDisconnected() { sendEmptyMessage(EVENT_INTERNET_DISCONNECTED); } }); mTelephonyManager.registerTelephonyCallback( new HandlerExecutor(this), mTelephonyStateListener); } Loading Loading @@ -170,9 +207,16 @@ public class DataStallRecoveryManager extends Handler { onDataConfigUpdated(); break; case EVENT_INTERNET_VALIDATION_STATUS_CHANGED: AsyncResult ar = (AsyncResult) msg.obj; int validationStatus = (int) ar.result; onInternetValidationStatusChanged(validationStatus); onInternetValidationStatusChanged(msg.arg1); break; case EVENT_INTERNET_CONNECTED: // handle internet connected event. break; case EVENT_INTERNET_DISCONNECTED: // handle internet disconnected event. break; default: loge("Unexpected message " + msg); break; } } Loading @@ -192,16 +236,6 @@ public class DataStallRecoveryManager extends Handler { } /** * Register for data stall reestablish event. * * @param handler The handler to handle the event. * @param what The event. */ public void registerForDataStallReestablishEvent(@NonNull Handler handler, int what) { mDataStallReestablishRegistrants.addUnique(handler, what, null); } /** Get recovery action from settings. */ @RecoveryAction private int getRecoveryAction() { Loading Loading @@ -262,7 +296,7 @@ public class DataStallRecoveryManager extends Handler { return; } log("cleanUpDataCall: notify clean up data call"); mDataStallReestablishRegistrants.notifyRegistrants(); mDataStallRecoveryManagerCallback.onDataStallReestablishInternet(); } /** Recovery Action: RECOVERY_ACTION_RADIO_RESTART */ Loading