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

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

Support preferred data profile correctly

Correctly support read/write preferred data profile.

Fix: 212906152
Test: manual & atest DataNetworkControllerTest DataProfileManagerTest
Change-Id: I8c403259b92cf812825abcbd3ccfcd602cba9526
parent 1ee362dc
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.text.TextUtils;
import android.util.IndentingPrintWriter;

import com.android.internal.R;
@@ -813,6 +814,15 @@ public class DataConfigManager extends Handler {
            CarrierConfigManager.KEY_DATA_STALL_RECOVERY_SHOULD_SKIP_BOOL_ARRAY);
    }

    /**
     * @return The default preferred APN. An empty string if not configured. This is used for the
     * first time boot up where preferred APN is not set.
     */
    public @NonNull String getDefaultPreferredApn() {
        return TextUtils.emptyIfNull(mCarrierConfig.getString(
                CarrierConfigManager.KEY_DEFAULT_PREFERRED_APN_NAME_STRING));
    }

    /**
     * Registration point for subscription info ready
     *
+6 −2
Original line number Diff line number Diff line
@@ -182,7 +182,7 @@ public class DataEvaluation {
        /** When emergency call started or ended. */
        EMERGENCY_CALL_CHANGED,
        /** When data disconnected, re-evaluate later to see if data could be brought up again. */
        DATA_NETWORK_DISCONNECTED,
        RETRY_AFTER_DISCONNECTED,
        /** Data setup retry. */
        DATA_RETRY,
    }
@@ -225,7 +225,11 @@ public class DataEvaluation {
        /** There is already a retry setup scheduled for this data profile. */
        RETRY_SCHEDULED(true),
        /** Network has explicitly request to throttle setup attempt. */
        DATA_THROTTLED(true);
        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);

        private final boolean mIsHardReason;

+2 −2
Original line number Diff line number Diff line
@@ -1880,7 +1880,7 @@ public class DataNetwork extends StateMachine {
    /**
     * @return {@code true} if in handover state.
     */
    public boolean isUnderHandover() {
    public boolean isHandoverInProgress() {
        return getCurrentState() == mHandoverState;
    }

@@ -1912,7 +1912,7 @@ public class DataNetwork extends StateMachine {
            return TelephonyManager.DATA_CONNECTED;
        } else if (isDisconnecting()) {
            return TelephonyManager.DATA_DISCONNECTING;
        } else if (isUnderHandover()) {
        } else if (isHandoverInProgress()) {
            return TelephonyManager.DATA_HANDOVER_IN_PROGRESS;
        }

+51 −25
Original line number Diff line number Diff line
@@ -145,9 +145,6 @@ public class DataNetworkController extends Handler {
    /** Event for SIM state changed. */
    private static final int EVENT_SIM_STATE_CHANGED = 9;

    /** Event for data profile changed. */
    private static final int EVENT_DATA_PROFILES_CHANGED = 10;

    /** Event for tearing down all data networks. */
    private static final int EVENT_TEAR_DOWN_ALL_DATA_NETWORKS = 12;

@@ -461,8 +458,13 @@ public class DataNetworkController extends Handler {
        public void onInternetDataNetworkValidationStatusChanged(
                @ValidationStatus int validationStatus) {}

        /** Called when internet data network is connected. */
        public void onInternetDataNetworkConnected() {}
        /**
         * Called when internet data network is connected.
         *
         * @param dataProfiles The data profiles of the connected internet data network. It should
         * be only one in most of the cases.
         */
        public void onInternetDataNetworkConnected(@NonNull List<DataProfile> dataProfiles) {}

        /** Called when internet data network is disconnected. */
        public void onInternetDataNetworkDisconnected() {}
@@ -677,7 +679,10 @@ public class DataNetworkController extends Handler {
                new DataProfileManagerCallback(this::post) {
                    @Override
                    public void onDataProfilesChanged() {
                        DataNetworkController.this.onDataStallReestablishInternet();
                        sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS,
                                DataEvaluationReason.DATA_PROFILES_CHANGED));
                        sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS,
                                DataEvaluationReason.DATA_PROFILES_CHANGED));
                    }
                });
        mDataStallRecoveryManager = new DataStallRecoveryManager(mPhone, this, mDataServiceManagers
@@ -829,12 +834,6 @@ public class DataNetworkController extends Handler {
                int simState = msg.arg1;
                onSimStateChanged(simState);
                break;
            case EVENT_DATA_PROFILES_CHANGED:
                sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS,
                        DataEvaluationReason.DATA_PROFILES_CHANGED));
                sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS,
                        DataEvaluationReason.DATA_PROFILES_CHANGED));
                break;
            case EVENT_TEAR_DOWN_ALL_DATA_NETWORKS:
                onTearDownAllDataNetworks(msg.arg1);
                break;
@@ -1128,7 +1127,8 @@ public class DataNetworkController extends Handler {
        if (dataProfile == null) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.NO_SUITABLE_DATA_PROFILE);
        } else if (reason == DataEvaluationReason.NEW_REQUEST
                && mDataRetryManager.isAnySetupRetryScheduled(dataProfile)) {
                && (mDataRetryManager.isAnySetupRetryScheduled(dataProfile)
                || mDataRetryManager.isSimilarNetworkRequestRetryScheduled(networkRequest))) {
            // If this is a new request, check if there is any retry already scheduled. For all
            // other evaluation reasons, since they are all condition changes, so if there is any
            // retry scheduled, we still want to go ahead and setup the data network.
@@ -1277,6 +1277,18 @@ public class DataNetworkController extends Handler {
            evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_DISABLED);
        }

        // Check if the data profile is still valid, sometimes the users can remove it from the APN
        // editor.
        if (!mDataProfileManager.isDataProfileValid(dataProfile)) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_PROFILE_INVALID);
        }

        // If users switch preferred profile in APN editor, we need to tear down network.
        if (dataNetwork.isInternetSupported()
                && !mDataProfileManager.isDataProfilePreferred(dataProfile)) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_PROFILE_NOT_PREFERRED);
        }

        if (evaluation.isDataAllowed()) {
            evaluation.addDataAllowedReason(DataAllowedReason.NORMAL);
        }
@@ -1740,8 +1752,14 @@ public class DataNetworkController extends Handler {
    private void onDataNetworkSetupRetry(@NonNull DataSetupRetryEntry dataSetupRetryEntry) {
        TelephonyNetworkRequest telephonyNetworkRequest =
                dataSetupRetryEntry.networkRequestList.get(0);
        if (!mAllNetworkRequestList.contains(telephonyNetworkRequest)) {
            log("onDataNetworkSetupRetry: " + telephonyNetworkRequest + " no longer in the list.");
        // Since this is a retry, the network request might be already removed. So we need to double
        // check and remove request if necessary.
        dataSetupRetryEntry.networkRequestList.removeIf(
                networkRequest -> !mAllNetworkRequestList.contains(networkRequest));

        if (dataSetupRetryEntry.networkRequestList.isEmpty()) {
            log("onDataNetworkSetupRetry: all network requests in the retry entry has been "
                    + "released. Retry cancelled.");
            dataSetupRetryEntry.setState(DataRetryEntry.RETRY_STATE_CANCELLED);
            return;
        }
@@ -1761,7 +1779,11 @@ public class DataNetworkController extends Handler {
        DataEvaluation evaluation = evaluateNetworkRequest(
                telephonyNetworkRequest, DataEvaluationReason.DATA_RETRY);
        if (evaluation.isDataAllowed()) {
            setupDataNetwork(dataSetupRetryEntry.dataProfile, dataSetupRetryEntry);
            DataProfile dataProfile = dataSetupRetryEntry.dataProfile;
            if (dataProfile == null) {
                dataProfile = evaluation.getCandidateDataProfile();
            }
            setupDataNetwork(dataProfile, dataSetupRetryEntry);
        }
    }

@@ -1887,9 +1909,9 @@ public class DataNetworkController extends Handler {

        // Sometimes network was unsolicitedly reported lost for reasons. We should re-evaluate
        // and see if data network can be re-established again.
        //TODO: Add some dalays here
        sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS,
                DataEvaluationReason.DATA_NETWORK_DISCONNECTED));
        sendMessageDelayed(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS,
                DataEvaluationReason.RETRY_AFTER_DISCONNECTED),
                mDataConfigManager.getRetrySetupAfterDisconnectMillis());
    }

    /**
@@ -2176,11 +2198,12 @@ public class DataNetworkController extends Handler {
    private void updateOverallInternetDataState() {
        boolean anyInternetConnected = mDataNetworkList.stream()
                .anyMatch(dataNetwork -> dataNetwork.isInternetSupported()
                        && (dataNetwork.isConnected() || dataNetwork.isUnderHandover()));
                        && (dataNetwork.isConnected() || dataNetwork.isHandoverInProgress()));
        // If any one is not suspended, then the overall is not suspended.
        List<DataNetwork> allConnectedInternetDataNetworks = mDataNetworkList.stream()
                .filter(DataNetwork::isInternetSupported)
                .filter(dataNetwork -> dataNetwork.isConnected() || dataNetwork.isUnderHandover())
                .filter(dataNetwork -> dataNetwork.isConnected()
                        || dataNetwork.isHandoverInProgress())
                .collect(Collectors.toList());
        boolean isSuspended = !allConnectedInternetDataNetworks.isEmpty()
                && allConnectedInternetDataNetworks.stream().allMatch(DataNetwork::isSuspended);
@@ -2199,14 +2222,17 @@ public class DataNetworkController extends Handler {
                    + TelephonyUtils.dataStateToString(mInternetDataNetworkState) + " to "
                    + TelephonyUtils.dataStateToString(dataNetworkState) + ".");
            // TODO: Create a new route to notify TelephonyRegistry.
            mInternetDataNetworkState = dataNetworkState;
            if (mInternetDataNetworkState == TelephonyManager.DATA_CONNECTED) {
            if (dataNetworkState == TelephonyManager.DATA_CONNECTED) {
                mDataNetworkControllerCallbacks.forEach(callback -> callback.invokeFromExecutor(
                        callback::onInternetDataNetworkConnected));
            } else if (mInternetDataNetworkState == TelephonyManager.DATA_DISCONNECTED) {
                        () -> callback.onInternetDataNetworkConnected(
                                allConnectedInternetDataNetworks.stream()
                                        .map(DataNetwork::getDataProfile)
                                        .collect(Collectors.toList()))));
            } else if (dataNetworkState == TelephonyManager.DATA_DISCONNECTED) {
                mDataNetworkControllerCallbacks.forEach(callback -> callback.invokeFromExecutor(
                        callback::onInternetDataNetworkDisconnected));
            } // TODO: Add suspended callback if needed.
            mInternetDataNetworkState = dataNetworkState;
        }
    }

+193 −67

File changed.

Preview size limit exceeded, changes collapsed.

Loading