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

Commit d0e7f909 authored by Jack Yu's avatar Jack Yu Committed by Gerrit Code Review
Browse files

Merge "Forward events to data stall recovery manager"

parents 62294657 f772c2ec
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 */