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

Commit f30c091f authored by Sewook Seo's avatar Sewook Seo Committed by Android (Google) Code Review
Browse files

Merge "Support handling reconnect to QualifiedNetworkType" into main

parents ef88673a cd2f50b3
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -111,3 +111,10 @@ flag {
  description: "When QNS prefers MMS on IWLAN, MMS will be attempted on IWLAN if it can, even though if existing cellular network already supports MMS."
  bug: "316211526"
}

flag {
  name: "reconnect_qualified_network"
  namespace: "telephony"
  description: "This flag is for internal implementation to handle reconnect request from QNS in telephony FWK."
  bug: "319520561"
}
 No newline at end of file
+1 −1
Original line number Diff line number Diff line
@@ -739,7 +739,7 @@ public class ServiceStateTracker extends Handler {

        mAccessNetworksManagerCallback = new AccessNetworksManagerCallback(this::post) {
            @Override
            public void onPreferredTransportChanged(int networkCapability) {
            public void onPreferredTransportChanged(int networkCapability, boolean forceReconnect) {
                // Check if preferred on IWLAN was changed in ServiceState.
                boolean isIwlanPreferred = mAccessNetworksManager.isAnyApnOnIwlan();
                if (mSS.isIwlanPreferred() != isIwlanPreferred) {
+32 −10
Original line number Diff line number Diff line
@@ -234,6 +234,11 @@ public class AccessNetworksManager extends Handler {
                    .mapToObj(AccessNetworkType::toString).collect(Collectors.joining(","))
                    + "]");

            handleQualifiedNetworksChanged(apnTypes, qualifiedNetworkTypes, false);
        }

        private void handleQualifiedNetworksChanged(
                int apnTypes, int[] qualifiedNetworkTypes, boolean forceReconnect) {
            if (Arrays.stream(qualifiedNetworkTypes).anyMatch(accessNetwork
                    -> !DataUtils.isValidAccessNetwork(accessNetwork))) {
                loge("Invalid access networks " + Arrays.toString(qualifiedNetworkTypes));
@@ -274,8 +279,9 @@ public class AccessNetworksManager extends Handler {
                                    AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
                            mAccessNetworksManagerCallbacks.forEach(callback ->
                                    callback.invokeFromExecutor(() ->
                                            callback.onPreferredTransportChanged(DataUtils
                                                    .apnTypeToNetworkCapability(apnType))));
                                            callback.onPreferredTransportChanged(
                                                    DataUtils.apnTypeToNetworkCapability(apnType),
                                                    forceReconnect)));
                        }
                    } else {
                        mAvailableNetworks.put(apnType, qualifiedNetworkTypes);
@@ -297,7 +303,7 @@ public class AccessNetworksManager extends Handler {
            }

            if (!qualifiedNetworksList.isEmpty()) {
                setPreferredTransports(qualifiedNetworksList);
                setPreferredTransports(qualifiedNetworksList, forceReconnect);
                mQualifiedNetworksChangedRegistrants.notifyResult(qualifiedNetworksList);
            }
        }
@@ -338,6 +344,17 @@ public class AccessNetworksManager extends Handler {
                }
            });
        }

        @Override
        public void onReconnectQualifedNetworkType(int apnTypes, int qualifiedNetworkType) {
            if (mFeatureFlags.reconnectQualifiedNetwork()) {
                log("onReconnectQualifedNetworkType: apnTypes = ["
                        + ApnSetting.getApnTypesStringFromBitmask(apnTypes)
                        + "], networks = [" + AccessNetworkType.toString(qualifiedNetworkType)
                        + "]");
                handleQualifiedNetworksChanged(apnTypes, new int[]{qualifiedNetworkType}, true);
            }
        }
    }

    private void onEmergencyDataNetworkPreferredTransportChanged(
@@ -371,8 +388,10 @@ public class AccessNetworksManager extends Handler {
         * Called when preferred transport changed.
         *
         * @param networkCapability The network capability.
         * @param forceReconnect whether enforce reconnection to the preferred transport type.
         */
        public abstract void onPreferredTransportChanged(@NetCapability int networkCapability);
        public abstract void onPreferredTransportChanged(
                @NetCapability int networkCapability, boolean forceReconnect);
    }

    /**
@@ -610,7 +629,8 @@ public class AccessNetworksManager extends Handler {
                : AccessNetworkConstants.TRANSPORT_TYPE_WWAN;
    }

    private void setPreferredTransports(@NonNull List<QualifiedNetworks> networksList) {
    private void setPreferredTransports(
            @NonNull List<QualifiedNetworks> networksList, boolean forceReconnect) {
        for (QualifiedNetworks networks : networksList) {
            if (networks.qualifiedNetworks.length > 0) {
                int transport = getTransportFromAccessNetwork(networks.qualifiedNetworks[0]);
@@ -618,11 +638,13 @@ public class AccessNetworksManager extends Handler {
                    mPreferredTransports.put(networks.apnType, transport);
                    mAccessNetworksManagerCallbacks.forEach(callback ->
                            callback.invokeFromExecutor(() ->
                                    callback.onPreferredTransportChanged(DataUtils
                                            .apnTypeToNetworkCapability(networks.apnType))));
                                    callback.onPreferredTransportChanged(
                                            DataUtils.apnTypeToNetworkCapability(networks.apnType),
                                            forceReconnect)));
                    logl("setPreferredTransports: apnType="
                            + ApnSetting.getApnTypeString(networks.apnType) + ", transport="
                            + AccessNetworkConstants.transportTypeToString(transport));
                            + AccessNetworkConstants.transportTypeToString(transport)
                            + (forceReconnect ? ", forceReconnect:true" : ""));
                }
            }
        }
@@ -643,7 +665,7 @@ public class AccessNetworksManager extends Handler {
     * Get the  preferred transport by network capability.
     *
     * @param networkCapability The network capability. (Note that only APN-type capabilities are
     * supported.
     * supported.)
     * @return The preferred transport.
     */
    public @TransportType int getPreferredTransportByNetworkCapability(
@@ -662,7 +684,7 @@ public class AccessNetworksManager extends Handler {
     * @return {@code true} if there is any APN is on IWLAN, otherwise {@code false}.
     */
    public boolean isAnyApnOnIwlan() {
        for (int apnType : AccessNetworksManager.SUPPORTED_APN_TYPES) {
        for (int apnType : SUPPORTED_APN_TYPES) {
            if (getPreferredTransport(apnType) == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
                return true;
            }
+1 −1
Original line number Diff line number Diff line
@@ -1198,7 +1198,7 @@ public class DataNetwork extends StateMachine {
                            getHandler()::post) {
                        @Override
                        public void onPreferredTransportChanged(
                                @NetCapability int networkCapability) {
                                @NetCapability int networkCapability, boolean forceReconnect) {
                            if (networkCapability == NetworkCapabilities.NET_CAPABILITY_MMS) {
                                log("MMS preference changed.");
                                updateNetworkCapabilities();
+19 −6
Original line number Diff line number Diff line
@@ -975,13 +975,16 @@ public class DataNetworkController extends Handler {

        mAccessNetworksManager.registerCallback(new AccessNetworksManagerCallback(this::post) {
            @Override
            public void onPreferredTransportChanged(@NetCapability int capability) {
            public void onPreferredTransportChanged(
                    @NetCapability int capability, boolean forceReconnect) {
                int preferredTransport = mAccessNetworksManager
                        .getPreferredTransportByNetworkCapability(capability);
                logl("onPreferredTransportChanged: "
                        + DataUtils.networkCapabilityToString(capability) + " preferred on "
                        + AccessNetworkConstants.transportTypeToString(preferredTransport));
                DataNetworkController.this.onEvaluatePreferredTransport(capability);
                        + AccessNetworkConstants.transportTypeToString(preferredTransport)
                        + (forceReconnect ? "forceReconnect:true" : ""));

                DataNetworkController.this.onEvaluatePreferredTransport(capability, forceReconnect);
                if (!hasMessages(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS)) {
                    sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS,
                            DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED));
@@ -1165,7 +1168,7 @@ public class DataNetworkController extends Handler {
                }
                break;
            case EVENT_EVALUATE_PREFERRED_TRANSPORT:
                onEvaluatePreferredTransport(msg.arg1);
                onEvaluatePreferredTransport(msg.arg1, msg.arg2 != 0 /* forceReconnect */);
                break;
            case EVENT_SUBSCRIPTION_PLANS_CHANGED:
                SubscriptionPlan[] plans = (SubscriptionPlan[]) msg.obj;
@@ -3359,8 +3362,12 @@ public class DataNetworkController extends Handler {
     * Called when needed to evaluate the preferred transport for certain capability.
     *
     * @param capability The network capability to evaluate.
     * @param forceReconnect indicates whether enforce reconnection to move to the preferred
     *                       transport type.
     *
     */
    private void onEvaluatePreferredTransport(@NetCapability int capability) {
    private void onEvaluatePreferredTransport(
            @NetCapability int capability, boolean forceReconnect) {
        int preferredTransport = mAccessNetworksManager
                .getPreferredTransportByNetworkCapability(capability);
        log("onEvaluatePreferredTransport: " + DataUtils.networkCapabilityToString(capability)
@@ -3384,7 +3391,13 @@ public class DataNetworkController extends Handler {
                    continue;
                }

                tryHandoverDataNetwork(dataNetwork, preferredTransport, null/*handoverRetryEntry*/);
                if (forceReconnect) {
                    tearDownGracefully(
                            dataNetwork, DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED);
                } else {
                    tryHandoverDataNetwork(
                            dataNetwork, preferredTransport, null/*handoverRetryEntry*/);
                }
            }
        }
    }
Loading