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

Commit ca5d48d7 authored by Jack Yu's avatar Jack Yu Committed by Automerger Merge Worker
Browse files

Merge "Forward events to data stall recovery manager" am: d0e7f909

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/telephony/+/2007851

Change-Id: Ie9e0d492644daa0167be45eba3915aed2f86c476
parents 04104cba d0e7f909
Loading
Loading
Loading
Loading
+15 −0
Original line number Original line Diff line number Diff line
@@ -1438,6 +1438,21 @@ public class DataNetwork extends StateMachine {
        return TelephonyManager.DATA_UNKNOWN;
        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
     * Get precise data connection state
     *
     *
+66 −36
Original line number Original line Diff line number Diff line
@@ -29,12 +29,12 @@ import android.os.AsyncResult;
import android.os.Handler;
import android.os.Handler;
import android.os.Looper;
import android.os.Looper;
import android.os.Message;
import android.os.Message;
import android.os.RegistrantList;
import android.telephony.AccessNetworkConstants;
import android.telephony.AccessNetworkConstants;
import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.Annotation.DataFailureCause;
import android.telephony.Annotation.DataFailureCause;
import android.telephony.Annotation.NetCapability;
import android.telephony.Annotation.NetCapability;
import android.telephony.Annotation.NetworkType;
import android.telephony.Annotation.NetworkType;
import android.telephony.Annotation.ValidationStatus;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.NetworkRegistrationInfo.RegistrationState;
import android.telephony.NetworkRegistrationInfo.RegistrationState;
import android.telephony.ServiceState;
import android.telephony.ServiceState;
@@ -95,26 +95,23 @@ public class DataNetworkController extends Handler {
    /** Re-evaluate all unsatisfied network requests. */
    /** Re-evaluate all unsatisfied network requests. */
    private static final int EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS = 5;
    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. */
    /** 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. */
    /** 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. */
    /** 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. */
    /** 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. */
    /** 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. */
    /** 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 Phone mPhone;
    private final String mLogTag;
    private final String mLogTag;
@@ -146,10 +143,10 @@ public class DataNetworkController extends Handler {
    private final @NonNull List<DataNetwork> mHistoricalDataNetworkList = new ArrayList<>();
    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 =
    private final @NonNull List<DataNetworkControllerCallback> mDataNetworkControllerCallbacks =
            new RegistrantList();
            new ArrayList<>();


    /** Indicates if packet switch data is restricted by the network. */
    /** Indicates if packet switch data is restricted by the network. */
    private boolean mPsRestricted = false;
    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
     * Constructor
     *
     *
@@ -319,7 +336,8 @@ public class DataNetworkController extends Handler {
        mDataProfileManager = new DataProfileManager(mPhone, this, mDataServiceManagers
        mDataProfileManager = new DataProfileManager(mPhone, this, mDataServiceManagers
                .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), looper);
                .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), looper);
        mDataStallRecoveryManager = new DataStallRecoveryManager(mPhone, this, mDataServiceManagers
        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);
        mDataRetryManager = new DataRetryManager(mPhone, this, looper);


        registerAllEvents();
        registerAllEvents();
@@ -337,8 +355,6 @@ public class DataNetworkController extends Handler {
        mDataRetryManager.registerForDataRetryCallback(dataRetryEntry ->
        mDataRetryManager.registerForDataRetryCallback(dataRetryEntry ->
                sendMessage(obtainMessage(EVENT_DATA_RETRY, dataRetryEntry)));
                sendMessage(obtainMessage(EVENT_DATA_RETRY, dataRetryEntry)));
        mDataConfigManager.registerForConfigUpdate(this, EVENT_DATA_CONFIG_UPDATED);
        mDataConfigManager.registerForConfigUpdate(this, EVENT_DATA_CONFIG_UPDATED);
        mDataStallRecoveryManager.registerForDataStallReestablishEvent(this,
                EVENT_DATA_STALL_ACTION_REESTABLISH);
        mDataProfileManager.registerForDataProfilesChanged(this, EVENT_DATA_PROFILES_CHANGED);
        mDataProfileManager.registerForDataProfilesChanged(this, EVENT_DATA_PROFILES_CHANGED);
        mPhone.getServiceStateTracker().registerForPsRestrictedEnabled(this,
        mPhone.getServiceStateTracker().registerForPsRestrictedEnabled(this,
                EVENT_PS_RESTRICT_ENABLED, null);
                EVENT_PS_RESTRICT_ENABLED, null);
@@ -371,9 +387,6 @@ public class DataNetworkController extends Handler {
            case EVENT_REMOVE_NETWORK_REQUEST:
            case EVENT_REMOVE_NETWORK_REQUEST:
                onRemoveNetworkRequest((NetworkRequest) msg.obj);
                onRemoveNetworkRequest((NetworkRequest) msg.obj);
                break;
                break;
            case EVENT_DATA_STALL_ACTION_REESTABLISH:
                onDataStallActionReestablish();
                break;
            case EVENT_PS_RESTRICT_ENABLED:
            case EVENT_PS_RESTRICT_ENABLED:
                mPsRestricted = true;
                mPsRestricted = true;
                break;
                break;
@@ -872,7 +885,10 @@ public class DataNetworkController extends Handler {
     * @param dataNetwork The data network.
     * @param dataNetwork The data network.
     */
     */
    private void onDataNetworkConnected(@NonNull DataNetwork dataNetwork) {
    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()
        // TODO: Add DataConfigManager.isRecoveryOnBadNetworkEnabled()

        if (dataNetwork.isInternet()) {
        NetworkCapabilities nc = dataNetwork.getNetworkCapabilities();
            mDataNetworkControllerCallbacks.forEach(callback ->
        if (nc != null
                    callback.onInternetDataNetworkValidationStatusChanged(
                && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                            dataValidationResult.getValidationStatus()));
                && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
                && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
                && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)) {
            mInternetValidationStatusRegistrants.notifyResult(
                    dataValidationResult.getValidationStatus());
        }
        }
    }
    }


@@ -925,6 +936,11 @@ public class DataNetworkController extends Handler {
            @DataFailureCause int cause) {
            @DataFailureCause int cause) {
        // TODO: Should perform retry here.
        // TODO: Should perform retry here.


        if (dataNetwork.isInternet()) {
            mDataNetworkControllerCallbacks.forEach(
                    DataNetworkControllerCallback::onInternetDataNetworkDisconnected);
        }

        mDataNetworkList.remove(dataNetwork);
        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 callback The callback.
     * @param what The event.
     */
     */
    public void registerForInternetValidationStatusChanged(@NonNull Handler handler, int what) {
    public void unregisterDataNetworkControllerCallback(
        mInternetValidationStatusRegistrants.addUnique(handler, what, null);
            @NonNull DataNetworkControllerCallback callback) {
        mDataNetworkControllerCallbacks.remove(callback);
    }
    }


    /**
    /**
+56 −22
Original line number Original line Diff line number Diff line
@@ -23,13 +23,11 @@ import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.Network;
import android.net.Network;
import android.os.AsyncResult;
import android.os.AsyncTask;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.HandlerExecutor;
import android.os.Looper;
import android.os.Looper;
import android.os.Message;
import android.os.Message;
import android.os.RegistrantList;
import android.provider.Settings;
import android.provider.Settings;
import android.telephony.Annotation.ValidationStatus;
import android.telephony.Annotation.ValidationStatus;
import android.telephony.PreciseDataConnectionState;
import android.telephony.PreciseDataConnectionState;
@@ -41,6 +39,7 @@ import android.util.IndentingPrintWriter;
import android.util.LocalLog;
import android.util.LocalLog;


import com.android.internal.telephony.Phone;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback;
import com.android.telephony.Rlog;
import com.android.telephony.Rlog;


import java.io.FileDescriptor;
import java.io.FileDescriptor;
@@ -75,6 +74,12 @@ public class DataStallRecoveryManager extends Handler {
    /** Event for internet validation status changed. */
    /** Event for internet validation status changed. */
    private static final int EVENT_INTERNET_VALIDATION_STATUS_CHANGED = 2;
    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 Phone mPhone;
    private final @NonNull String mLogTag;
    private final @NonNull String mLogTag;
    private final @NonNull LocalLog mLocalLog = new LocalLog(128);
    private final @NonNull LocalLog mLocalLog = new LocalLog(128);
@@ -100,29 +105,44 @@ public class DataStallRecoveryManager extends Handler {
    /** Telephony Manager */
    /** Telephony Manager */
    private TelephonyManager mTelephonyManager;
    private TelephonyManager mTelephonyManager;


    /** The RegistrantList for recovery action reestablish. */
    private final RegistrantList mDataStallReestablishRegistrants = new RegistrantList();

    /** Listening the callback from TelephonyCallback. */
    /** Listening the callback from TelephonyCallback. */
    private TelephonyStateListener mTelephonyStateListener;
    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
     * Constructor
     *
     *
     * @param phone The phone instance.
     * @param phone The phone instance.
     * @param dataNetworkController Data network controller
     * @param dataServiceManager The WWAN data service manager.
     * @param dataServiceManager The WWAN data service manager.
     * @param looper The looper to be used by the handler. Currently the handler thread is the
     * @param looper The looper to be used by the handler. Currently the handler thread is the
     * phone process's main thread.
     * phone process's main thread.
     * @param callback Callback to notify data network controller for data stall events.
     */
     */
    public DataStallRecoveryManager(@NonNull Phone phone,
    public DataStallRecoveryManager(@NonNull Phone phone,
            @NonNull DataNetworkController dataNetworkController,
            @NonNull DataNetworkController dataNetworkController,
            @NonNull DataServiceManager dataServiceManager, @NonNull Looper looper) {
            @NonNull DataServiceManager dataServiceManager, @NonNull Looper looper,
            @NonNull DataStallRecoveryManagerCallback callback) {
        super(looper);
        super(looper);
        mPhone = phone;
        mPhone = phone;
        mLogTag = "DSTMTR-" + mPhone.getPhoneId();
        mLogTag = "DSTMTR-" + mPhone.getPhoneId();
        mDataNetworkController = dataNetworkController;
        mDataNetworkController = dataNetworkController;
        mWwanDataServiceManager = dataServiceManager;
        mWwanDataServiceManager = dataServiceManager;
        mDataConfigManager = mDataNetworkController.getDataConfigManager();
        mDataConfigManager = mDataNetworkController.getDataConfigManager();
        mDataStallRecoveryManagerCallback = callback;
        mResolver = mPhone.getContext().getContentResolver();
        mResolver = mPhone.getContext().getContentResolver();
        mTelephonyManager = mPhone.getContext().getSystemService(TelephonyManager.class);
        mTelephonyManager = mPhone.getContext().getSystemService(TelephonyManager.class);
        mConnectivityManager = mPhone.getContext().getSystemService(ConnectivityManager.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. */
    /** Register for all events that data stall monitor is interested. */
    private void registerAllEvents() {
    private void registerAllEvents() {
        mDataConfigManager.registerForConfigUpdate(this, EVENT_DATA_CONFIG_UPDATED);
        mDataConfigManager.registerForConfigUpdate(this, EVENT_DATA_CONFIG_UPDATED);
        mDataNetworkController.registerForInternetValidationStatusChanged(this,
        mDataNetworkController.registerDataNetworkControllerCallback(
                EVENT_INTERNET_VALIDATION_STATUS_CHANGED);
                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(
        mTelephonyManager.registerTelephonyCallback(
                    new HandlerExecutor(this), mTelephonyStateListener);
                    new HandlerExecutor(this), mTelephonyStateListener);
    }
    }
@@ -170,9 +207,16 @@ public class DataStallRecoveryManager extends Handler {
                onDataConfigUpdated();
                onDataConfigUpdated();
                break;
                break;
            case EVENT_INTERNET_VALIDATION_STATUS_CHANGED:
            case EVENT_INTERNET_VALIDATION_STATUS_CHANGED:
                AsyncResult ar = (AsyncResult) msg.obj;
                onInternetValidationStatusChanged(msg.arg1);
                int validationStatus = (int) ar.result;
                break;
                onInternetValidationStatusChanged(validationStatus);
            case EVENT_INTERNET_CONNECTED:
                // handle internet connected event.
                break;
            case EVENT_INTERNET_DISCONNECTED:
                // handle internet disconnected event.
                break;
            default:
                loge("Unexpected message " + msg);
                break;
                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. */
    /** Get recovery action from settings. */
    @RecoveryAction
    @RecoveryAction
    private int getRecoveryAction() {
    private int getRecoveryAction() {
@@ -262,7 +296,7 @@ public class DataStallRecoveryManager extends Handler {
            return;
            return;
        }
        }
        log("cleanUpDataCall: notify clean up data call");
        log("cleanUpDataCall: notify clean up data call");
        mDataStallReestablishRegistrants.notifyRegistrants();
        mDataStallRecoveryManagerCallback.onDataStallReestablishInternet();
    }
    }


    /** Recovery Action: RECOVERY_ACTION_RADIO_RESTART */
    /** Recovery Action: RECOVERY_ACTION_RADIO_RESTART */