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

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

Replaced TelephonyNetworkFactory with TelephonyNetworkProvider

Adapted the new network provider model. The new TelephonyNetworkProvider
is a singleton responsible for providing all telephony related networks
including networks on cellular and IWLAN across all active SIMs.

Flag: com.android.internal.telephony.flags.support_network_provider
Fix: 343370895
Test: Comprehensive telephony tests including mobile data and voice call
      tests.
Test: atest TelephonyNetworkProviderTest
Change-Id: I99b236131606b83c2733a313715c313486b9a953
parent 2e69b68b
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -181,4 +181,14 @@ flag {
  bug:"353723350"
}

# OWNER=jackyu TARGET=25Q1
flag {
  name: "support_network_provider"
  namespace: "telephony"
  description: "Deprecate network factory and adapt the new network provider model from connectivity service"
  bug: "343370895"
  metadata {
    purpose: PURPOSE_BUGFIX
  }
}
+34 −7
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager;
import com.android.internal.telephony.data.CellularNetworkValidator;
import com.android.internal.telephony.data.PhoneSwitcher;
import com.android.internal.telephony.data.TelephonyNetworkFactory;
import com.android.internal.telephony.data.TelephonyNetworkProvider;
import com.android.internal.telephony.euicc.EuiccCardController;
import com.android.internal.telephony.euicc.EuiccController;
import com.android.internal.telephony.flags.FeatureFlags;
@@ -101,6 +102,7 @@ public class PhoneFactory {
    static private SimultaneousCallingTracker sSimultaneousCallingTracker;
    static private PhoneSwitcher sPhoneSwitcher;
    static private TelephonyNetworkFactory[] sTelephonyNetworkFactories;
    private static TelephonyNetworkProvider sTelephonyNetworkProvider;
    static private NotificationChannelController sNotificationChannelController;
    static private CellularNetworkValidator sCellularNetworkValidator;

@@ -285,6 +287,11 @@ public class PhoneFactory {

                sNotificationChannelController = new NotificationChannelController(context);

                if (featureFlags.supportNetworkProvider()) {
                    // Create the TelephonyNetworkProvider instance, which is a singleton.
                    sTelephonyNetworkProvider = new TelephonyNetworkProvider(Looper.myLooper(),
                            context, featureFlags);
                } else {
                    for (int i = 0; i < numPhones; i++) {
                        sTelephonyNetworkFactories[i] = new TelephonyNetworkFactory(
                                Looper.myLooper(), sPhones[i], featureFlags);
@@ -292,6 +299,7 @@ public class PhoneFactory {
                }
            }
        }
    }

    /**
     * Upon single SIM to dual SIM switch or vice versa, we dynamically allocate or de-allocate
@@ -312,7 +320,10 @@ public class PhoneFactory {

            sPhones = copyOf(sPhones, activeModemCount);
            sCommandsInterfaces = copyOf(sCommandsInterfaces, activeModemCount);

            if (!sFeatureFlags.supportNetworkProvider()) {
                sTelephonyNetworkFactories = copyOf(sTelephonyNetworkFactories, activeModemCount);
            }

            int cdmaSubscription = CdmaSubscriptionSourceManager.getDefault(context);
            for (int i = prevActiveModemCount; i < activeModemCount; i++) {
@@ -324,11 +335,14 @@ public class PhoneFactory {
                        PackageManager.FEATURE_TELEPHONY_IMS)) {
                    sPhones[i].createImsPhone();
                }

                if (!sFeatureFlags.supportNetworkProvider()) {
                    sTelephonyNetworkFactories[i] = new TelephonyNetworkFactory(
                            Looper.myLooper(), sPhones[i], sFeatureFlags);
                }
            }
        }
    }

    private static Phone createPhone(Context context, int phoneId) {
        int phoneType = TelephonyManager.getPhoneType(RILConstants.PREFERRED_NETWORK_MODE);
@@ -393,6 +407,10 @@ public class PhoneFactory {
        }
    }

    public static TelephonyNetworkProvider getNetworkProvider() {
        return sTelephonyNetworkProvider;
    }

    /**
     * Get the network factory associated with a given phone ID.
     * @param phoneId the phone id
@@ -579,13 +597,22 @@ public class PhoneFactory {
            pw.flush();
            pw.println("++++++++++++++++++++++++++++++++");

            if (!sFeatureFlags.supportNetworkProvider()) {
                sTelephonyNetworkFactories[i].dump(fd, pw, args);
            }

            pw.flush();
            pw.decreaseIndent();
            pw.println("++++++++++++++++++++++++++++++++");
        }

        pw.increaseIndent();
        if (sFeatureFlags.supportNetworkProvider()) {
            sTelephonyNetworkProvider.dump(fd, pw, args);
        }
        pw.decreaseIndent();
        pw.println("++++++++++++++++++++++++++++++++");

        pw.println("UiccController:");
        pw.increaseIndent();
        try {
+1 −1
Original line number Diff line number Diff line
@@ -466,7 +466,7 @@ public class RadioConfig extends Handler {
        RILRequest rr = obtainRequest(RIL_REQUEST_SET_PREFERRED_DATA_MODEM,
                result, mDefaultWorkSource);
        if (DBG) {
            logd(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
            logd(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest) + " " + modemId);
        }
        try {
            proxy.setPreferredDataModem(rr.mSerial, modemId);
+80 −11
Original line number Diff line number Diff line
@@ -100,6 +100,7 @@ import com.android.internal.telephony.data.DataRetryManager.DataHandoverRetryEnt
import com.android.internal.telephony.data.DataRetryManager.DataRetryEntry;
import com.android.internal.telephony.data.DataSettingsManager.DataSettingsManagerCallback;
import com.android.internal.telephony.data.LinkBandwidthEstimator.LinkBandwidthEstimatorCallback;
import com.android.internal.telephony.data.PhoneSwitcher.PhoneSwitcherCallback;
import com.android.internal.telephony.data.TelephonyNetworkAgent.TelephonyNetworkAgentCallback;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.metrics.DataCallSessionStats;
@@ -271,6 +272,9 @@ public class DataNetwork extends StateMachine {
    /** Event for response to data network validation request. */
    private static final int EVENT_DATA_NETWORK_VALIDATION_RESPONSE = 29;

    /** Event for preferred data subscription changed. */
    private static final int EVENT_PREFERRED_DATA_SUBSCRIPTION_CHANGED = 30;

    /** Invalid context id. */
    private static final int INVALID_CID = -1;

@@ -591,6 +595,10 @@ public class DataNetwork extends StateMachine {
    @NonNull
    private final DataNetworkController mDataNetworkController;

    /** Phone switcher which is responsible to determine which phone to route network request. */
    @NonNull
    private final PhoneSwitcher mPhoneSwitcher;

    /** Data network controller callback. */
    @NonNull
    private final DataNetworkController.DataNetworkControllerCallback
@@ -676,6 +684,13 @@ public class DataNetwork extends StateMachine {
    /** Whether the current data network is congested. */
    private boolean mCongested = false;

    /**
     * Whether the current data network is on preferred data modem.
     *
     * @see PhoneSwitcher#getPreferredDataPhoneId()
     */
    private boolean mOnPreferredDataPhone;

    /** The network requests associated with this data network */
    @NonNull
    private final NetworkRequestList mAttachedNetworkRequestList =
@@ -814,6 +829,12 @@ public class DataNetwork extends StateMachine {
    @Nullable
    private PreciseDataConnectionState mPreciseDataConnectionState;

    /**
     * Callback to listen event from {@link PhoneSwitcher}.
     */
    @NonNull
    private PhoneSwitcherCallback mPhoneSwitcherCallback;

    /**
     * The network bandwidth.
     */
@@ -1027,6 +1048,8 @@ public class DataNetwork extends StateMachine {
        mAccessNetworksManager = phone.getAccessNetworksManager();
        mVcnManager = mPhone.getContext().getSystemService(VcnManager.class);
        mDataNetworkController = phone.getDataNetworkController();
        mPhoneSwitcher = PhoneSwitcher.getInstance();
        mOnPreferredDataPhone = phone.getPhoneId() == mPhoneSwitcher.getPreferredDataPhoneId();
        mDataNetworkControllerCallback = new DataNetworkController.DataNetworkControllerCallback(
                getHandler()::post) {
            @Override
@@ -1156,14 +1179,25 @@ public class DataNetwork extends StateMachine {
            configBuilder.setNat64DetectionEnabled(false);
        }

        NetworkProvider provider;
        if (mFlags.supportNetworkProvider()) {
            provider = PhoneFactory.getNetworkProvider();
        } else {
            final NetworkFactory factory = PhoneFactory.getNetworkFactory(
                    mPhone.getPhoneId());
        final NetworkProvider provider = (null == factory) ? null : factory.getProvider();
            provider = (null == factory) ? null : factory.getProvider();
        }

        mNetworkScore = new NetworkScore.Builder()
        NetworkScore.Builder builder = new NetworkScore.Builder()
                .setKeepConnectedReason(isHandoverInProgress()
                        ? NetworkScore.KEEP_CONNECTED_FOR_HANDOVER
                        : NetworkScore.KEEP_CONNECTED_NONE).build();
                        : NetworkScore.KEEP_CONNECTED_NONE);
        if (mFlags.supportNetworkProvider()) {
            builder.setTransportPrimary(mOnPreferredDataPhone);
        }
        mNetworkScore = builder.build();
        logl("mNetworkScore: isPrimary=" + mNetworkScore.isTransportPrimary()
                + ", keepConnectedReason=" + mNetworkScore.getKeepConnectedReason());

        return new TelephonyNetworkAgent(mPhone, getHandler().getLooper(), this,
                mNetworkScore, configBuilder.build(), provider,
@@ -1225,6 +1259,16 @@ public class DataNetwork extends StateMachine {
            mDataNetworkController.getDataSettingsManager()
                    .registerCallback(mDataSettingsManagerCallback);

            if (mFlags.supportNetworkProvider()) {
                mPhoneSwitcherCallback = new PhoneSwitcherCallback(Runnable::run) {
                    @Override
                    public void onPreferredDataPhoneIdChanged(int phoneId) {
                        sendMessage(EVENT_PREFERRED_DATA_SUBSCRIPTION_CHANGED, phoneId, 0);
                    }
                };
                mPhoneSwitcher.registerCallback(mPhoneSwitcherCallback);
            }

            mPhone.getDisplayInfoController().registerForTelephonyDisplayInfoChanged(
                    getHandler(), EVENT_DISPLAY_INFO_CHANGED, null);
            mPhone.getServiceStateTracker().registerForServiceStateChanged(getHandler(),
@@ -1318,6 +1362,9 @@ public class DataNetwork extends StateMachine {
            mPhone.getServiceStateTracker().unregisterForServiceStateChanged(getHandler());
            mPhone.getDisplayInfoController().unregisterForTelephonyDisplayInfoChanged(
                    getHandler());
            if (mFlags.supportNetworkProvider()) {
                mPhoneSwitcher.unregisterCallback(mPhoneSwitcherCallback);
            }
            mDataNetworkController.getDataSettingsManager()
                    .unregisterCallback(mDataSettingsManagerCallback);
            mRil.unregisterForPcoData(getHandler());
@@ -1351,13 +1398,13 @@ public class DataNetwork extends StateMachine {
                }
                case EVENT_ATTACH_NETWORK_REQUEST: {
                    onAttachNetworkRequests((NetworkRequestList) msg.obj);
                    updateNetworkScore(isHandoverInProgress());
                    updateNetworkScore();
                    break;
                }
                case EVENT_DETACH_NETWORK_REQUEST: {
                    onDetachNetworkRequest((TelephonyNetworkRequest) msg.obj,
                            msg.arg1 != 0 /* shouldRetry */);
                    updateNetworkScore(isHandoverInProgress());
                    updateNetworkScore();
                    break;
                }
                case EVENT_DETACH_ALL_NETWORK_REQUESTS: {
@@ -1428,6 +1475,12 @@ public class DataNetwork extends StateMachine {
                    // handle the resultCode in response for the request.
                    handleDataNetworkValidationRequestResultCode(msg.arg1 /* resultCode */);
                    break;
                case EVENT_PREFERRED_DATA_SUBSCRIPTION_CHANGED:
                    mOnPreferredDataPhone = mPhone.getPhoneId() == msg.arg1;
                    logl("Preferred data phone id changed to " + msg.arg1
                            + ", mOnPreferredDataPhone=" + mOnPreferredDataPhone);
                    updateNetworkScore();
                    break;
                default:
                    loge("Unhandled event " + eventToString(msg.what));
                    break;
@@ -3314,6 +3367,12 @@ public class DataNetwork extends StateMachine {
        return mLinkStatus;
    }

    /**
     * Update the network score and report to connectivity service if necessary.
     */
    private void updateNetworkScore() {
        updateNetworkScore(isHandoverInProgress());
    }

    /**
     * Update the network score and report to connectivity service if necessary.
@@ -3323,10 +3382,18 @@ public class DataNetwork extends StateMachine {
    private void updateNetworkScore(boolean keepConnectedForHandover) {
        int connectedReason = keepConnectedForHandover
                ? NetworkScore.KEEP_CONNECTED_FOR_HANDOVER : NetworkScore.KEEP_CONNECTED_NONE;
        if (mNetworkScore.getKeepConnectedReason() != connectedReason) {
            mNetworkScore = new NetworkScore.Builder()
                    .setKeepConnectedReason(connectedReason).build();
        if (mNetworkScore.getKeepConnectedReason() != connectedReason
                || (mFlags.supportNetworkProvider()
                && mNetworkScore.isTransportPrimary() != mOnPreferredDataPhone)) {
            NetworkScore.Builder builder = new NetworkScore.Builder()
                    .setKeepConnectedReason(connectedReason);
            if (mFlags.supportNetworkProvider()) {
                builder.setTransportPrimary(mOnPreferredDataPhone);
            }
            mNetworkScore = builder.build();
            mNetworkAgent.sendNetworkScore(mNetworkScore);
            logl("updateNetworkScore: isPrimary=" + mNetworkScore.isTransportPrimary()
                    + ", keepConnectedForHandover=" + keepConnectedForHandover);
        }
    }

@@ -4055,12 +4122,14 @@ public class DataNetwork extends StateMachine {
        pw.println("Tag: " + name());
        pw.increaseIndent();
        pw.println("mSubId=" + mSubId);
        pw.println("mOnPreferredDataPhone=" + mOnPreferredDataPhone);
        pw.println("mTransport=" + AccessNetworkConstants.transportTypeToString(mTransport));
        pw.println("mLastKnownDataNetworkType=" + TelephonyManager
                .getNetworkTypeName(mLastKnownDataNetworkType));
        pw.println("WWAN cid=" + mCid.get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN));
        pw.println("WLAN cid=" + mCid.get(AccessNetworkConstants.TRANSPORT_TYPE_WLAN));
        pw.println("mNetworkScore=" + mNetworkScore);
        pw.println("keepConnectedReason=" + mNetworkScore.getKeepConnectedReason());
        pw.println("mDataAllowedReason=" + mDataAllowedReason);
        pw.println("mPduSessionId=" + mPduSessionId);
        pw.println("mDataProfile=" + mDataProfile);
+25 −1
Original line number Diff line number Diff line
@@ -2516,6 +2516,30 @@ public class DataNetworkController extends Handler {
    }

    private void onRemoveNetworkRequest(@NonNull TelephonyNetworkRequest request) {
        if (mFeatureFlags.supportNetworkProvider()) {
            if (!mAllNetworkRequestList.remove(request)) {
                loge("onRemoveNetworkRequest: Network request does not exist. " + request);
                return;
            }

            if (request.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)) {
                mImsThrottleCounter.addOccurrence();
                mLastReleasedImsRequestCapabilities = request.getCapabilities();
                mLastImsOperationIsRelease = true;
            }

            if (request.getAttachedNetwork() != null) {
                request.getAttachedNetwork().detachNetworkRequest(
                        request, false /* shouldRetry */);
            }

            request.setState(TelephonyNetworkRequest.REQUEST_STATE_UNSATISFIED);
            request.setEvaluation(null);

            log("onRemoveNetworkRequest: Removed " + request);
            return;
        }

        // The request generated from telephony network factory does not contain the information
        // the original request has, for example, attached data network. We need to find the
        // original one.
Loading