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

Commit 18ffcab9 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes Iaf2df7f7,Ib6d856da,I0d9907d8

* changes:
  Added IWLAN handover policy support
  Exposed link status for network type controller
  Replaced link state with link status
parents c209ae48 bc796f8a
Loading
Loading
Loading
Loading
+41 −33
Original line number Diff line number Diff line
@@ -34,11 +34,12 @@ import android.telephony.SubscriptionManager;
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
import android.telephony.data.DataCallResponse.LinkStatus;
import android.text.TextUtils;

import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback;
import com.android.internal.telephony.dataconnection.DataConnection;
import com.android.internal.telephony.dataconnection.DcController;
import com.android.internal.telephony.dataconnection.DcController.PhysicalLinkState;
import com.android.internal.telephony.dataconnection.DcTracker;
import com.android.internal.telephony.util.ArrayUtils;
import com.android.internal.util.IState;
@@ -88,7 +89,7 @@ public class NetworkTypeController extends StateMachine {
    private static final int EVENT_DATA_RAT_CHANGED = 2;
    private static final int EVENT_NR_STATE_CHANGED = 3;
    private static final int EVENT_NR_FREQUENCY_CHANGED = 4;
    private static final int EVENT_PHYSICAL_LINK_STATE_CHANGED = 5;
    private static final int EVENT_PHYSICAL_LINK_STATUS_CHANGED = 5;
    private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED = 6;
    private static final int EVENT_CARRIER_CONFIG_CHANGED = 7;
    private static final int EVENT_PRIMARY_TIMER_EXPIRED = 8;
@@ -107,7 +108,7 @@ public class NetworkTypeController extends StateMachine {
        sEvents[EVENT_DATA_RAT_CHANGED] = "EVENT_DATA_RAT_CHANGED";
        sEvents[EVENT_NR_STATE_CHANGED] = "EVENT_NR_STATE_CHANGED";
        sEvents[EVENT_NR_FREQUENCY_CHANGED] = "EVENT_NR_FREQUENCY_CHANGED";
        sEvents[EVENT_PHYSICAL_LINK_STATE_CHANGED] = "EVENT_PHYSICAL_LINK_STATE_CHANGED";
        sEvents[EVENT_PHYSICAL_LINK_STATUS_CHANGED] = "EVENT_PHYSICAL_LINK_STATUS_CHANGED";
        sEvents[EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED] =
                "EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED";
        sEvents[EVENT_CARRIER_CONFIG_CHANGED] = "EVENT_CARRIER_CONFIG_CHANGED";
@@ -148,7 +149,7 @@ public class NetworkTypeController extends StateMachine {
    private String mPrimaryTimerState;
    private String mSecondaryTimerState;
    private String mPreviousState;
    private @PhysicalLinkState int mPhysicalLinkState;
    private @LinkStatus int mPhysicalLinkStatus;
    private boolean mIsPhysicalChannelConfig16Supported;
    private Boolean mIsNrAdvancedAllowedByPco = false;
    private int mNrAdvancedCapablePcoId = 0;
@@ -208,11 +209,6 @@ public class NetworkTypeController extends StateMachine {
        mIsPhysicalChannelConfig16Supported = mPhone.getContext().getSystemService(
                TelephonyManager.class).isRadioInterfaceCapabilitySupported(
                TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED);
        if (!mIsPhysicalChannelConfig16Supported) {
            mPhone.getDcTracker(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                    .registerForPhysicalLinkStateChanged(getHandler(),
                            EVENT_PHYSICAL_LINK_STATE_CHANGED);
        }
        mPhone.getServiceStateTracker().registerForNrStateChanged(getHandler(),
                EVENT_NR_STATE_CHANGED, null);
        mPhone.getServiceStateTracker().registerForNrFrequencyChanged(getHandler(),
@@ -296,10 +292,22 @@ public class NetworkTypeController extends StateMachine {
                        CarrierConfigManager.KEY_ENABLE_NR_ADVANCED_WHILE_ROAMING_BOOL);
                mIsUsingUserDataForRrcDetection = b.getBoolean(
                        CarrierConfigManager.KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL);
                if (mIsPhysicalChannelConfig16Supported && mIsUsingUserDataForRrcDetection) {
                if (!mIsPhysicalChannelConfig16Supported || mIsUsingUserDataForRrcDetection) {
                    if (mPhone.isUsingNewDataStack()) {
                        mPhone.getDataNetworkController().registerDataNetworkControllerCallback(
                                new DataNetworkControllerCallback(getHandler()::post) {
                                    @Override
                                    public void onPhysicalLinkStatusChanged(
                                            @LinkStatus int status) {
                                        sendMessage(obtainMessage(
                                                EVENT_PHYSICAL_LINK_STATUS_CHANGED,
                                                new AsyncResult(null, status, null)));
                                    }});
                    } else {
                        mPhone.getDcTracker(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                            .registerForPhysicalLinkStateChanged(getHandler(),
                                    EVENT_PHYSICAL_LINK_STATE_CHANGED);
                                .registerForPhysicalLinkStatusChanged(getHandler(),
                                        EVENT_PHYSICAL_LINK_STATUS_CHANGED);
                    }
                }
            }
        }
@@ -527,12 +535,12 @@ public class NetworkTypeController extends StateMachine {
                    break;
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
                    if (isUsingPhysicalChannelConfigForRrcDetection()) {
                        mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig();
                        mPhysicalLinkStatus = getPhysicalLinkStatusFromPhysicalChannelConfig();
                    }
                    break;
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                case EVENT_PHYSICAL_LINK_STATUS_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    mPhysicalLinkStatus = (int) ar.result;
                    break;
                case EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED:
                    AsyncResult result = (AsyncResult) msg.obj;
@@ -632,7 +640,7 @@ public class NetworkTypeController extends StateMachine {
                    break;
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
                    if (isUsingPhysicalChannelConfigForRrcDetection()) {
                        mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig();
                        mPhysicalLinkStatus = getPhysicalLinkStatusFromPhysicalChannelConfig();
                        if (mIsTimerResetEnabledForLegacyStateRRCIdle && !isPhysicalLinkActive()) {
                            resetAllTimers();
                        }
@@ -640,9 +648,9 @@ public class NetworkTypeController extends StateMachine {
                    // Update in case of LTE/LTE+ switch
                    updateOverrideNetworkType();
                    break;
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                case EVENT_PHYSICAL_LINK_STATUS_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    mPhysicalLinkStatus = (int) ar.result;
                    if (mIsTimerResetEnabledForLegacyStateRRCIdle && !isPhysicalLinkActive()) {
                        resetAllTimers();
                        updateOverrideNetworkType();
@@ -704,7 +712,7 @@ public class NetworkTypeController extends StateMachine {
                    break;
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
                    if (isUsingPhysicalChannelConfigForRrcDetection()) {
                        mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig();
                        mPhysicalLinkStatus = getPhysicalLinkStatusFromPhysicalChannelConfig();
                        if (isNrNotRestricted()) {
                            // NOT_RESTRICTED_RRC_IDLE -> NOT_RESTRICTED_RRC_CON
                            if (isPhysicalLinkActive()) {
@@ -719,9 +727,9 @@ public class NetworkTypeController extends StateMachine {
                    // Update in case of LTE/LTE+ switch
                    updateOverrideNetworkType();
                    break;
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                case EVENT_PHYSICAL_LINK_STATUS_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    mPhysicalLinkStatus = (int) ar.result;
                    if (isNrNotRestricted()) {
                        // NOT_RESTRICTED_RRC_IDLE -> NOT_RESTRICTED_RRC_CON
                        if (isPhysicalLinkActive()) {
@@ -788,7 +796,7 @@ public class NetworkTypeController extends StateMachine {
                    break;
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
                    if (isUsingPhysicalChannelConfigForRrcDetection()) {
                        mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig();
                        mPhysicalLinkStatus = getPhysicalLinkStatusFromPhysicalChannelConfig();
                        if (isNrNotRestricted()) {
                            // NOT_RESTRICTED_RRC_CON -> NOT_RESTRICTED_RRC_IDLE
                            if (!isPhysicalLinkActive()) {
@@ -803,9 +811,9 @@ public class NetworkTypeController extends StateMachine {
                    // Update in case of LTE/LTE+ switch
                    updateOverrideNetworkType();
                    break;
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                case EVENT_PHYSICAL_LINK_STATUS_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    mPhysicalLinkStatus = (int) ar.result;
                    if (isNrNotRestricted()) {
                        // NOT_RESTRICTED_RRC_CON -> NOT_RESTRICTED_RRC_IDLE
                        if (!isPhysicalLinkActive()) {
@@ -880,13 +888,13 @@ public class NetworkTypeController extends StateMachine {
                case EVENT_NR_FREQUENCY_CHANGED:
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
                    if (isUsingPhysicalChannelConfigForRrcDetection()) {
                        mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig();
                        mPhysicalLinkStatus = getPhysicalLinkStatusFromPhysicalChannelConfig();
                    }
                    updateNrAdvancedState();
                    break;
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                case EVENT_PHYSICAL_LINK_STATUS_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    mPhysicalLinkStatus = (int) ar.result;
                    if (!isNrConnected()) {
                        log("NR state changed. Sending EVENT_NR_STATE_CHANGED");
                        sendMessage(EVENT_NR_STATE_CHANGED);
@@ -1214,14 +1222,14 @@ public class NetworkTypeController extends StateMachine {
    }

    private boolean isPhysicalLinkActive() {
        return mPhysicalLinkState == DcController.PHYSICAL_LINK_ACTIVE;
        return mPhysicalLinkStatus == DataCallResponse.LINK_STATUS_ACTIVE;
    }

    private int getPhysicalLinkStateFromPhysicalChannelConfig() {
    private int getPhysicalLinkStatusFromPhysicalChannelConfig() {
        List<PhysicalChannelConfig> physicalChannelConfigList =
                mPhone.getServiceStateTracker().getPhysicalChannelConfigList();
        return (physicalChannelConfigList == null || physicalChannelConfigList.isEmpty())
                ? DcController.PHYSICAL_LINK_NOT_ACTIVE : DcController.PHYSICAL_LINK_ACTIVE;
                ? DataCallResponse.LINK_STATUS_DORMANT : DataCallResponse.LINK_STATUS_ACTIVE;
    }

    private int getDataNetworkType() {
@@ -1283,7 +1291,7 @@ public class NetworkTypeController extends StateMachine {
        pw.println("mPrimaryTimerState=" + mPrimaryTimerState);
        pw.println("mSecondaryTimerState=" + mSecondaryTimerState);
        pw.println("mPreviousState=" + mPreviousState);
        pw.println("mPhysicalLinkState=" + mPhysicalLinkState);
        pw.println("mPhysicalLinkStatus=" + mPhysicalLinkStatus);
        pw.println("mAdditionalNrAdvancedBandsList="
                + Arrays.toString(mAdditionalNrAdvancedBandsList));
        pw.println("mNrAdvancedCapablePcoId=" + mNrAdvancedCapablePcoId);
+5 −5
Original line number Diff line number Diff line
@@ -656,16 +656,16 @@ public class AccessNetworksManager extends Handler {
        for (QualifiedNetworks networks : networksList) {
            if (networks.qualifiedNetworks.length > 0) {
                int transport = getTransportFromAccessNetwork(networks.qualifiedNetworks[0]);
                if (getCurrentTransport(networks.apnType) != transport) {
                if (getPreferredTransport(networks.apnType) != transport) {
                    mAccessNetworksManagerCallbacks.forEach(callback ->
                            callback.invokeFromExecutor(() ->
                                    callback.onPreferredTransportChanged(DataUtils
                                            .apnTypeToNetworkCapability(networks.apnType))));
                }
                    mPreferredTransports.put(networks.apnType, transport);
                    logl("setPreferredTransports: apnType="
                        + ApnSetting.getApnTypeString(networks.apnType)
                        + ", transport=" + AccessNetworkConstants.transportTypeToString(transport));
                            + ApnSetting.getApnTypeString(networks.apnType) + ", transport="
                            + AccessNetworkConstants.transportTypeToString(transport));
                }
            }
        }
    }
+22 −8
Original line number Diff line number Diff line
@@ -21,14 +21,17 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.telephony.data.DataProfile;

import com.android.internal.annotations.VisibleForTesting;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * The class to describe a data evaluation for whether allowing or disallowing
 * establishing a data network.
 * The class to describe a data evaluation for whether allowing or disallowing certain operations
 * like setup a data network, sustaining existing data networks, or handover between IWLAN and
 * cellular.
 */
public class DataEvaluation {
    /** The reason for this evaluation */
@@ -107,7 +110,7 @@ public class DataEvaluation {
    }

    /**
     * @return {@code true} if data is allowed.
     * @return {@code true} if the operation is allowed.
     */
    public boolean isDataAllowed() {
        return mDataDisallowedReasons.size() == 0;
@@ -155,8 +158,11 @@ public class DataEvaluation {
        return false;
    }

    /** The reason for evaluating unsatisfied network requests. */
    enum DataEvaluationReason {
    /**
     * The reason for evaluating unsatisfied network requests, existing data networks, and handover.
     */
    @VisibleForTesting
    public enum DataEvaluationReason {
        /** New request from the apps. */
        NEW_REQUEST,
        /** Data config changed. */
@@ -185,9 +191,13 @@ public class DataEvaluation {
        RETRY_AFTER_DISCONNECTED,
        /** Data setup retry. */
        DATA_RETRY,
        /** Handover between IWLAN and cellular. */
        DATA_HANDOVER,
        /** Preferred transport changed. */
        PREFERRED_TRANSPORT_CHANGED,
    }

    /** Disallowed reasons. There could be multiple reasons if data connection is not allowed. */
    /** Disallowed reasons. There could be multiple reasons if it is not allowed. */
    public enum DataDisallowedReason {
        // Soft failure reasons. A soft reason means that in certain conditions, data is still
        // allowed. Normally those reasons are due to users settings.
@@ -222,14 +232,18 @@ public class DataEvaluation {
        DATA_NETWORK_TYPE_NOT_ALLOWED(true),
        /** Device is currently in an emergency call. */
        EMERGENCY_CALL(true),
        /** There is already a retry setup scheduled for this data profile. */
        /** There is already a retry setup/handover scheduled. */
        RETRY_SCHEDULED(true),
        /** Network has explicitly request to throttle setup attempt. */
        DATA_THROTTLED(true),
        /** Data profile becomes invalid. (could be removed by the user, or SIM refresh, etc..) */
        DATA_PROFILE_INVALID(true),
        /** Data profile not preferred (i.e. users switch preferred profile in APN editor.) */
        DATA_PROFILE_NOT_PREFERRED(true);
        DATA_PROFILE_NOT_PREFERRED(true),
        /** Handover is not allowed by policy. */
        NOT_ALLOWED_BY_POLICY(true),
        /** Data network is not in the right state. */
        ILLEGAL_STATE(true);

        private final boolean mIsHardReason;

+36 −2
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
import android.telephony.data.DataCallResponse.HandoverFailureMode;
import android.telephony.data.DataCallResponse.LinkStatus;
import android.telephony.data.DataProfile;
import android.telephony.data.DataService;
import android.telephony.data.DataServiceCallback;
@@ -211,6 +212,7 @@ public class DataNetwork extends StateMachine {
                    TEAR_DOWN_REASON_POWER_OFF_BY_CARRIER,
                    TEAR_DOWN_REASON_DATA_STALL,
                    TEAR_DOWN_REASON_HANDOVER_FAILED,
                    TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED,
            })
    public @interface TearDownReason {}

@@ -253,6 +255,9 @@ public class DataNetwork extends StateMachine {
    /** Data network tear down due to handover failed. */
    public static final int TEAR_DOWN_REASON_HANDOVER_FAILED = 13;

    /** Data network tear down due to handover not allowed. */
    public static final int TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED = 14;

    @IntDef(prefix = {"BANDWIDTH_SOURCE_"},
            value = {
                    BANDWIDTH_SOURCE_UNKNOWN,
@@ -393,6 +398,9 @@ public class DataNetwork extends StateMachine {
    /** The network slice info. */
    private @Nullable NetworkSliceInfo mNetworkSliceInfo;

    /** The link status (i.e. RRC state). */
    private @LinkStatus int mLinkStatus = DataCallResponse.LINK_STATUS_UNKNOWN;

    /** The network bandwidth. */
    private @NonNull NetworkBandwidth mNetworkBandwidth = new NetworkBandwidth(14, 14);

@@ -578,6 +586,15 @@ public class DataNetwork extends StateMachine {
        public abstract void onHandoverFailed(@NonNull DataNetwork dataNetwork,
                @DataFailureCause int cause, long retryDurationMillis,
                @HandoverFailureMode int handoverFailureMode);

        /**
         * Called when data network link status (i.e. RRC state) changed.
         *
         * @param dataNetwork The data network.
         * @param linkStatus The link status (i.e. RRC state).
         */
        public abstract void onLinkStatusChanged(@NonNull DataNetwork dataNetwork,
                @LinkStatus int linkStatus);
    }

    /**
@@ -783,7 +800,7 @@ public class DataNetwork extends StateMachine {
                case EVENT_DATA_STATE_CHANGED: {
                    AsyncResult ar = (AsyncResult) msg.obj;
                    int transport = (int) ar.userObj;
                    onDataStateChanged(transport, (ArrayList<DataCallResponse>) ar.result);
                    onDataStateChanged(transport, (List<DataCallResponse>) ar.result);
                    break;
                }
                case EVENT_START_HANDOVER:
@@ -1382,8 +1399,16 @@ public class DataNetwork extends StateMachine {

        // Set PDU session id
        if (mPduSessionId != response.getPduSessionId()) {
            log("PDU session id updated to " + mPduSessionId);
            mPduSessionId = response.getPduSessionId();
            log("PDU session id updated to " + mPduSessionId);
        }

        // Set the link status
        if (mLinkStatus != response.getLinkStatus()) {
            mLinkStatus = response.getLinkStatus();
            log("Link status updated to " + DataUtils.linkStatusToString(mLinkStatus));
            mDataNetworkCallback.invokeFromExecutor(
                    () -> mDataNetworkCallback.onLinkStatusChanged(DataNetwork.this, mLinkStatus));
        }

        // Set link addresses
@@ -1866,6 +1891,13 @@ public class DataNetwork extends StateMachine {
        return TelephonyManager.NETWORK_TYPE_UNKNOWN;
    }

    /**
     * @return The physical link status (i.e. RRC state).
     */
    public @LinkStatus int getLinkStatus() {
        return mLinkStatus;
    }

    /**
     * @return The network score. The higher score of the network has higher chance to be
     * selected by the connectivity service as active network.
@@ -2164,6 +2196,8 @@ public class DataNetwork extends StateMachine {
                return "TEAR_DOWN_REASON_DATA_STALL";
            case TEAR_DOWN_REASON_HANDOVER_FAILED:
                return "TEAR_DOWN_REASON_HANDOVER_FAILED";
            case TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED:
                return "TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED";
            default:
                return "UNKNOWN(" + reason + ")";
        }
+135 −44

File changed.

Preview size limit exceeded, changes collapsed.

Loading