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

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

Merge "Added enhanced IWLAN handover check support" into tm-dev am: fa3761f1

parents 45b645b1 fa3761f1
Loading
Loading
Loading
Loading
+22 −9
Original line number Diff line number Diff line
@@ -220,19 +220,19 @@ public class DataConfigManager extends Handler {

    /**
     * Timeout in ms before creating an anomaly report for a DataNetwork stuck in
     * {@link DataNetwork#ConnectingState}.
     * {@link DataNetwork.ConnectingState}.
     */
    private int mNetworkConnectingTimeout;

    /**
     * Timeout in ms before creating an anomaly report for a DataNetwork stuck in
     * {@link DataNetwork#DisconnectingState}.
     * {@link DataNetwork.DisconnectingState}.
     */
    private int mNetworkDisconnectingTimeout;

    /**
     * Timeout in ms before creating an anomaly report for a DataNetwork stuck in
     * {@link DataNetwork#HandoverState}.
     * {@link DataNetwork.HandoverState}.
     */
    private int mNetworkHandoverTimeout;

@@ -776,7 +776,7 @@ public class DataConfigManager extends Handler {

    /**
     * @return Timeout in ms before creating an anomaly report for a DataNetwork stuck in
     * {@link DataNetwork#ConnectingState}.
     * {@link DataNetwork.ConnectingState}.
     */
    public int getAnomalyNetworkConnectingTimeoutMs() {
        return mNetworkConnectingTimeout;
@@ -784,7 +784,7 @@ public class DataConfigManager extends Handler {

    /**
     * @return Timeout in ms before creating an anomaly report for a DataNetwork stuck in
     * {@link DataNetwork#DisconnectingState}.
     * {@link DataNetwork.DisconnectingState}.
     */
    public int getAnomalyNetworkDisconnectingTimeoutMs() {
        return mNetworkDisconnectingTimeout;
@@ -792,7 +792,7 @@ public class DataConfigManager extends Handler {

    /**
     * @return Timeout in ms before creating an anomaly report for a DataNetwork stuck in
     * {@link DataNetwork#HandoverState}.
     * {@link DataNetwork.HandoverState}.
     */
    public int getNetworkHandoverTimeoutMs() {
        return mNetworkHandoverTimeout;
@@ -1116,10 +1116,22 @@ public class DataConfigManager extends Handler {
    }

    /**
     * Registration point for subscription info ready
     * @return {@code true} if enhanced IWLAN handover check is enabled. If enabled, telephony
     * frameworks will not perform handover if the target transport is out of service, or VoPS not
     * supported. The network will be torn down on the source transport, and will be
     * re-established on the target transport when condition is allowed for bringing up a new
     * network.
     */
    public boolean isEnhancedIwlanHandoverCheckEnabled() {
        return mResources.getBoolean(
                com.android.internal.R.bool.config_enhanced_iwlan_handover_check);
    }

    /**
     * Registration point for subscription info ready.
     *
     * @param h handler to notify
     * @param what what code of message when delivered
     * @param h handler to notify.
     * @param what what code of message when delivered.
     */
    public void registerForConfigUpdate(Handler h, int what) {
        mConfigUpdateRegistrants.addUnique(h, what, null);
@@ -1213,6 +1225,7 @@ public class DataConfigManager extends Handler {
        pw.println("Bandwidth estimation source=" + mResources.getString(
                com.android.internal.R.string.config_bandwidthEstimateSource));
        pw.println("isDelayTearDownImsEnabled=" + isImsDelayTearDownEnabled());
        pw.println("isEnhancedIwlanHandoverCheckEnabled=" + isEnhancedIwlanHandoverCheckEnabled());
        pw.decreaseIndent();
    }
}
+14 −1
Original line number Diff line number Diff line
@@ -148,12 +148,25 @@ public class DataEvaluation {
     * Check if only one disallowed reason prevent data connection.
     *
     * @param reason The given reason to check
     * @return True if the given reason is the only one that prevents data connection
     * @return {@code true} if the given reason is the only one that prevents data connection
     */
    public boolean containsOnly(DataDisallowedReason reason) {
        return mDataDisallowedReasons.size() == 1 && contains(reason);
    }

    /**
     * Check if the any of the disallowed reasons match one of the provided reason.
     *
     * @param reasons The given reasons to check.
     * @return {@code true} if any of the given reasons matches one of the disallowed reasons.
     */
    public boolean containsAny(DataDisallowedReason... reasons) {
        for (DataDisallowedReason reason : reasons) {
            if (mDataDisallowedReasons.contains(reason)) return true;
        }
        return false;
    }

    /**
     * Check if the allowed reason is the specified reason.
     *
+1 −1
Original line number Diff line number Diff line
@@ -1745,7 +1745,7 @@ public class DataNetwork extends StateMachine {
                    NetworkRegistrationInfo nri = getNetworkRegistrationInfo();
                    if (nri != null) {
                        DataSpecificRegistrationInfo dsri = nri.getDataSpecificInfo();
                        // Check if VoPS is supported by the network.
                        // Check if the network is non-VoPS.
                        if (dsri != null && dsri.getVopsSupportInfo() != null
                                && !dsri.getVopsSupportInfo().isVopsSupported()) {
                            builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL);
+44 −9
Original line number Diff line number Diff line
@@ -1777,19 +1777,46 @@ public class DataNetworkController extends Handler {
    private @NonNull DataEvaluation evaluateDataNetworkHandover(@NonNull DataNetwork dataNetwork) {
        DataEvaluation dataEvaluation = new DataEvaluation(DataEvaluationReason.DATA_HANDOVER);
        if (!dataNetwork.isConnecting() && !dataNetwork.isConnected()) {
            log("evaluateDataNetworkHandover:" + dataNetwork
                    + " it not in the right state.");
            dataEvaluation.addDataDisallowedReason(DataDisallowedReason.ILLEGAL_STATE);
            return dataEvaluation;
        }

        if (mDataRetryManager.isAnyHandoverRetryScheduled(dataNetwork)) {
            log("evaluateDataNetworkHandover: Found handover retry entry for "
                    + dataNetwork);
            dataEvaluation.addDataDisallowedReason(DataDisallowedReason.RETRY_SCHEDULED);
            return dataEvaluation;
        }

        // If enhanced handover check is enabled, perform extra checks.
        if (mDataConfigManager.isEnhancedIwlanHandoverCheckEnabled()) {
            int targetTransport = DataUtils.getTargetTransport(dataNetwork.getTransport());
            NetworkRegistrationInfo nri = mServiceState.getNetworkRegistrationInfo(
                    NetworkRegistrationInfo.DOMAIN_PS, targetTransport);
            if (nri != null) {
                // Check if OOS on target transport.
                if (!nri.isInService()) {
                    dataEvaluation.addDataDisallowedReason(DataDisallowedReason.NOT_IN_SERVICE);
                }

                // Check if VoPS is required, but the target transport is non-VoPS.
                NetworkRequestList networkRequestList =
                        dataNetwork.getAttachedNetworkRequestList();
                if (networkRequestList.stream().anyMatch(request
                        -> request.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL))) {
                    DataSpecificRegistrationInfo dsri = nri.getDataSpecificInfo();
                    // Check if the network is non-VoPS.
                    if (dsri != null && dsri.getVopsSupportInfo() != null
                            && !dsri.getVopsSupportInfo().isVopsSupported()) {
                        dataEvaluation.addDataDisallowedReason(
                                DataDisallowedReason.VOPS_NOT_SUPPORTED);
                    }
                }

                if (dataEvaluation.containsDisallowedReasons()) {
                    return dataEvaluation;
                }
            }
        }

        if (mDataConfigManager.isIwlanHandoverPolicyEnabled()) {
            List<HandoverRule> handoverRules = mDataConfigManager.getHandoverRules();

@@ -1841,7 +1868,6 @@ public class DataNetworkController extends Handler {

        // Allow handover by default if no rule is found/not enabled by config.
        dataEvaluation.addDataAllowedReason(DataAllowedReason.NORMAL);
        log("evaluateDataNetworkHandover: " + dataEvaluation);
        return dataEvaluation;
    }

@@ -2836,18 +2862,27 @@ public class DataNetworkController extends Handler {
                }

                DataEvaluation dataEvaluation = evaluateDataNetworkHandover(dataNetwork);
                log("evaluatePreferredTransport: " + dataEvaluation + ", " + dataNetwork);
                if (!dataEvaluation.containsDisallowedReasons()) {
                    logl("Start handover " + dataNetwork + " to "
                            + AccessNetworkConstants.transportTypeToString(preferredTransport));
                    dataNetwork.startHandover(preferredTransport, null);
                } else if (dataEvaluation.containsOnly(
                        DataDisallowedReason.NOT_ALLOWED_BY_POLICY)) {
                    logl("evaluatePreferredTransport: Handover not allowed by policy. Tear "
                            + "down the network so a new network can be setup on "
                } else if (dataEvaluation.containsAny(DataDisallowedReason.NOT_ALLOWED_BY_POLICY,
                        DataDisallowedReason.NOT_IN_SERVICE,
                        DataDisallowedReason.VOPS_NOT_SUPPORTED)) {
                    logl("evaluatePreferredTransport: Handover not allowed. Tear "
                            + "down " + dataNetwork + " so a new network can be setup on "
                            + AccessNetworkConstants.transportTypeToString(preferredTransport)
                            + ".");
                    tearDownGracefully(dataNetwork,
                            DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED);
                } else if (dataEvaluation.containsAny(DataDisallowedReason.ILLEGAL_STATE,
                        DataDisallowedReason.RETRY_SCHEDULED)) {
                    logl("evaluatePreferredTransport: Handover not allowed. " + dataNetwork
                            + " will remain on " + AccessNetworkConstants.transportTypeToString(
                                    dataNetwork.getTransport()));
                } else {
                    loge("evaluatePreferredTransport: Unexpected handover evaluation result.");
                }
            }
        }