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

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

Exposed link status for network type controller

Bug: 213246140
Test: atest DataNetworkControllerTest

Merged-In: Ib6d856dafbe5cc8f5ce6ada3db99f5ac7f406802
Change-Id: Ib6d856dafbe5cc8f5ce6ada3db99f5ac7f406802
parent 50b369df
Loading
Loading
Loading
Loading
+19 −10
Original line number Diff line number Diff line
@@ -35,8 +35,10 @@ 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.DcTracker;
import com.android.internal.telephony.util.ArrayUtils;
@@ -147,7 +149,7 @@ public class NetworkTypeController extends StateMachine {
    private String mPrimaryTimerState;
    private String mSecondaryTimerState;
    private String mPreviousState;
    private @DataCallResponse.LinkStatus int mPhysicalLinkStatus;
    private @LinkStatus int mPhysicalLinkStatus;
    private boolean mIsPhysicalChannelConfig16Supported;
    private Boolean mIsNrAdvancedAllowedByPco = false;
    private int mNrAdvancedCapablePcoId = 0;
@@ -207,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)
                    .registerForPhysicalLinkStatusChanged(getHandler(),
                            EVENT_PHYSICAL_LINK_STATUS_CHANGED);
        }
        mPhone.getServiceStateTracker().registerForNrStateChanged(getHandler(),
                EVENT_NR_STATE_CHANGED, null);
        mPhone.getServiceStateTracker().registerForNrFrequencyChanged(getHandler(),
@@ -295,13 +292,25 @@ 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)
                                .registerForPhysicalLinkStatusChanged(getHandler(),
                                        EVENT_PHYSICAL_LINK_STATUS_CHANGED);
                    }
                }
            }
        }
        createTimerRules(nrIconConfiguration, overrideTimerRule, overrideSecondaryTimerRule);
    }

+30 −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;
@@ -393,6 +394,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 +582,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 +796,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 +1395,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 +1887,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.
+42 −15
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ import android.telephony.TelephonyManager.SimState;
import android.telephony.TelephonyRegistryManager;
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.ims.ImsException;
import android.telephony.ims.ImsManager;
@@ -263,6 +264,9 @@ public class DataNetworkController extends Handler {
     */
    private @DataState int mImsDataNetworkState = TelephonyManager.DATA_DISCONNECTED;

    /** Overall aggregated link status from internet data networks. */
    private @LinkStatus int mInternetLinkStatus = DataCallResponse.LINK_STATUS_UNKNOWN;

    /** Data network controller callbacks. */
    private final @NonNull Set<DataNetworkControllerCallback> mDataNetworkControllerCallbacks =
            new ArraySet<>();
@@ -508,6 +512,13 @@ public class DataNetworkController extends Handler {
         * override is set.
         */
        public void onSubscriptionPlanOverride() {}

        /**
         * Called when the physical link status changed.
         *
         * @param status The latest link status.
         */
        public void onPhysicalLinkStatusChanged(@LinkStatus int status) {}
    }

    /**
@@ -1667,21 +1678,6 @@ public class DataNetworkController extends Handler {
                .collect(Collectors.toList()));
    }

    /**
     * Find unsatisfied network requests that can be satisfied by the given network capabilities.
     *
     * @param capabilities The network capabilities.
     * @return The network requests list.
     */
    private @NonNull NetworkRequestList findSatisfiableNetworkRequests(
            @NonNull NetworkCapabilities capabilities) {
        return new NetworkRequestList(mAllNetworkRequestList.stream()
                .filter(request -> request.getState()
                        == TelephonyNetworkRequest.REQUEST_STATE_UNSATISFIED)
                .filter(request -> capabilities.satisfiedByNetworkCapabilities(capabilities))
                .collect(Collectors.toList()));
    }

    /**
     * Setup data network.
     *
@@ -1783,6 +1779,12 @@ public class DataNetworkController extends Handler {
                        DataNetworkController.this.onDataNetworkHandoverFailed(
                                dataNetwork, cause, retryDelayMillis, handoverFailureMode);
                    }

                    @Override
                    public void onLinkStatusChanged(@NonNull DataNetwork dataNetwork,
                            @LinkStatus int linkStatus) {
                        DataNetworkController.this.onLinkStatusChanged(dataNetwork, linkStatus);
                    }
                }));
        if (!mAnyDataNetworkExisting) {
            mAnyDataNetworkExisting = true;
@@ -2189,6 +2191,31 @@ public class DataNetworkController extends Handler {
        log("Subscription plans initialized: " + mSubscriptionPlans);
    }

    /**
     * Called when data network's link status changed.
     *
     * @param dataNetwork The data network that has link status changed.
     * @param linkStatus The link status (i.e. RRC state).
     */
    private void onLinkStatusChanged(@NonNull DataNetwork dataNetwork, @LinkStatus int linkStatus) {
        // TODO: Since this is only used for 5G icon display logic, so we only use internet data
        //   data network's link status. Consider expanding to all data networks if needed, and
        //   should use CarrierConfigManager.KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL
        //   to determine if using all data networks or only internet data networks.
        boolean anyActive = mDataNetworkList.stream()
                .filter(DataNetwork::isInternetSupported)
                .anyMatch(network -> network.getLinkStatus()
                        == DataCallResponse.LINK_STATUS_ACTIVE);
        int status = anyActive ? DataCallResponse.LINK_STATUS_ACTIVE
                : DataCallResponse.LINK_STATUS_DORMANT;
        if (mInternetLinkStatus != status) {
            log("Internet link status changed to " + DataUtils.linkStatusToString(status));
            mInternetLinkStatus = status;
            mDataNetworkControllerCallbacks.forEach(callback -> callback.invokeFromExecutor(
                    () -> callback.onPhysicalLinkStatusChanged(mInternetLinkStatus)));
        }
    }

    /**
     * Check if needed to re-evaluate the existing data networks.
     *
+4 −3
Original line number Diff line number Diff line
@@ -214,13 +214,14 @@ public class DataProfileManager extends Handler {
            while (cursor.moveToNext()) {
                ApnSetting apn = ApnSetting.makeApnSetting(cursor);
                if (apn != null) {
                    profiles.add(new DataProfile.Builder()
                    DataProfile dataProfile = new DataProfile.Builder()
                            .setApnSetting(apn)
                            // TODO: Support TD correctly once ENTERPRISE becomes an APN type.
                            .setTrafficDescriptor(new TrafficDescriptor(apn.getApnName(), null))
                            .setPreferred(false)
                            .build());
                    log("Added " + apn);
                            .build();
                    profiles.add(dataProfile);
                    log("Added " + dataProfile);
                }
            }
            cursor.close();
+18 −0
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ import android.telephony.Annotation.ValidationStatus;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.ApnSetting.ApnType;
import android.telephony.data.DataCallResponse;
import android.telephony.data.DataCallResponse.LinkStatus;
import android.telephony.data.DataProfile;
import android.telephony.ims.feature.ImsFeature;
import android.util.ArrayMap;
@@ -395,4 +397,20 @@ public class DataUtils {
                ? AccessNetworkConstants.TRANSPORT_TYPE_WLAN
                : AccessNetworkConstants.TRANSPORT_TYPE_WWAN;
    }

    /**
     * Convert link status to string.
     *
     * @param linkStatus The link status.
     * @return The link status in string format.
     */
    public static @NonNull String linkStatusToString(@LinkStatus int linkStatus) {
        switch (linkStatus) {
            case DataCallResponse.LINK_STATUS_UNKNOWN: return "UNKNOWN";
            case DataCallResponse.LINK_STATUS_INACTIVE: return "INACTIVE";
            case DataCallResponse.LINK_STATUS_ACTIVE: return "ACTIVE";
            case DataCallResponse.LINK_STATUS_DORMANT: return "DORMANT";
            default: return "UNKNOWN(" + linkStatus + ")";
        }
    }
}
Loading