Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f772c2ec authored by Jack Yu's avatar Jack Yu
Browse files

Forward events to data stall recovery manager

Feed validation status, internet connected/disconnected
event to data stall recovery manager. Also forward
re-establish internet event to data network controller.

Bug: 196597630
Test: Manual
Merged-In: If7688d1ed55d5d3b49ba5367d0327f9cb517956e
Change-Id: If7688d1ed55d5d3b49ba5367d0327f9cb517956e
parent 228cce86
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -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
     *
+66 −36
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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
     *
@@ -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();
@@ -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);
@@ -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;
@@ -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);
        }
    }

    /**
@@ -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()));
        }
    }

@@ -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);
    }

@@ -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");
    }

    /**
@@ -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);
    }

    /**
+56 −22
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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);
@@ -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);
@@ -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);
    }
@@ -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;
        }
    }
@@ -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() {
@@ -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 */