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

Commit 75c77f6a authored by Daniel Bright's avatar Daniel Bright Committed by Gerrit Code Review
Browse files

Merge "Added configurable priority on apn types"

parents 57c12f4b 18615403
Loading
Loading
Loading
Loading
+21 −3
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ import android.telephony.data.ApnSetting;
import android.util.LocalLog;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.dataconnection.ApnConfigTypeRepository;
import com.android.internal.telephony.dataconnection.DcRequest;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent;
@@ -153,7 +154,7 @@ public class PhoneSwitcher extends Handler {
        }
    }

    private final List<DcRequest> mPrioritizedDcRequests = new ArrayList<DcRequest>();
    private final List<DcRequest> mPrioritizedDcRequests = new ArrayList<>();
    private final RegistrantList mActivePhoneRegistrants;
    private final SubscriptionController mSubscriptionController;
    private final Context mContext;
@@ -682,7 +683,8 @@ public class PhoneSwitcher extends Handler {
    }

    private void onRequestNetwork(NetworkRequest networkRequest) {
        final DcRequest dcRequest = DcRequest.create(networkRequest);
        final DcRequest dcRequest =
                DcRequest.create(networkRequest, createApnRepository(networkRequest));
        if (dcRequest != null) {
            if (!mPrioritizedDcRequests.contains(dcRequest)) {
                collectRequestNetworkMetrics(networkRequest);
@@ -695,7 +697,8 @@ public class PhoneSwitcher extends Handler {
    }

    private void onReleaseNetwork(NetworkRequest networkRequest) {
        final DcRequest dcRequest = DcRequest.create(networkRequest);
        final DcRequest dcRequest =
                DcRequest.create(networkRequest, createApnRepository(networkRequest));
        if (dcRequest != null) {
            if (mPrioritizedDcRequests.remove(dcRequest)) {
                onEvaluate(REQUESTS_CHANGED, "netReleased");
@@ -705,6 +708,21 @@ public class PhoneSwitcher extends Handler {
        }
    }

    private ApnConfigTypeRepository createApnRepository(NetworkRequest networkRequest) {
        int phoneIdForRequest = phoneIdForRequest(networkRequest);
        int subId = mSubscriptionController.getSubIdUsingPhoneId(phoneIdForRequest);
        CarrierConfigManager configManager = (CarrierConfigManager) mContext
                .getSystemService(Context.CARRIER_CONFIG_SERVICE);

        PersistableBundle carrierConfig;
        if (configManager != null) {
            carrierConfig = configManager.getConfigForSubId(subId);
        } else {
            carrierConfig = null;
        }
        return new ApnConfigTypeRepository(carrierConfig);
    }

    private void removeDefaultNetworkChangeCallback() {
        removeMessages(EVENT_REMOVE_DEFAULT_NETWORK_CHANGE_CALLBACK);
        mDefaultNetworkCallback.mExpectedSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+5 −4
Original line number Diff line number Diff line
@@ -20,13 +20,14 @@ import android.telephony.Annotation;

/**
 * Container of network configuration settings relevant for telephony module.
 *
 */
class ApnConfigType {
public class ApnConfigType {

    private final int mType;
    private final int mPriority;

    ApnConfigType(@Annotation.ApnType int type, int priority) {
    public ApnConfigType(@Annotation.ApnType int type, int priority) {
        mType = type;
        mPriority = priority;
    }
@@ -35,7 +36,7 @@ class ApnConfigType {
     * Returns the apn type of this config type
     * @return Type of apn.
     */
    int getType() {
    public int getType() {
        return mType;
    }

@@ -43,7 +44,7 @@ class ApnConfigType {
     * Returns the priority of this apn config type.
     * @return The priority of this apn.
     */
    int getPriority() {
    public int getPriority() {
        return mPriority;
    }
}
+67 −28
Original line number Diff line number Diff line
@@ -18,8 +18,12 @@ package com.android.internal.telephony.dataconnection;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.PersistableBundle;
import android.telephony.Annotation;
import android.telephony.CarrierConfigManager;
import android.telephony.Rlog;
import android.telephony.data.ApnSetting;
import android.util.ArrayMap;

import java.util.Collection;
import java.util.HashMap;
@@ -29,24 +33,15 @@ import java.util.Map;
 * Hard coded configuration of specific network types that the telephony module needs.
 * Formerly stored in network attributes within the resources file.
 */
public final class ApnConfigTypeRepository {
public class ApnConfigTypeRepository {

    private static final ApnConfigTypeRepository sDefault = new ApnConfigTypeRepository();
    private static final String TAG = ApnConfigTypeRepository.class.getSimpleName();

    private final Map<Integer, ApnConfigType> mConfigTypeMap;

    ApnConfigTypeRepository() {
    public ApnConfigTypeRepository(PersistableBundle carrierConfig) {
        mConfigTypeMap = new HashMap<>();
        setup();
    }

    /**
     * Gets the default instance of the repository.
     * @return The singleton instance of repository.
     */
    @NonNull
    public static ApnConfigTypeRepository getDefault() {
        return sDefault;
        setup(carrierConfig);
    }

    /**
@@ -67,22 +62,66 @@ public final class ApnConfigTypeRepository {
        return mConfigTypeMap.get(type);
    }

    private void setup() {
        add(ApnSetting.TYPE_DEFAULT, 0);
        add(ApnSetting.TYPE_MMS, 2);
        add(ApnSetting.TYPE_SUPL, 2);
        add(ApnSetting.TYPE_DUN, 2);
        add(ApnSetting.TYPE_HIPRI, 3);
        add(ApnSetting.TYPE_FOTA, 2);
        add(ApnSetting.TYPE_IMS, 2);
        add(ApnSetting.TYPE_CBS, 2);
        add(ApnSetting.TYPE_IA, 2);
        add(ApnSetting.TYPE_EMERGENCY, 2);
        add(ApnSetting.TYPE_MCX, 3);
        add(ApnSetting.TYPE_XCAP, 3);
    private void setup(PersistableBundle carrierConfig) {
        addApns(getCarrierApnTypeMap(CarrierConfigManager.getDefaultConfig()));
        addApns(getCarrierApnTypeMap(carrierConfig));
    }

    private void addApns(Map<Integer, Integer> apnTypeMap) {
        add(ApnSetting.TYPE_DEFAULT, apnTypeMap);
        add(ApnSetting.TYPE_MMS, apnTypeMap);
        add(ApnSetting.TYPE_SUPL, apnTypeMap);
        add(ApnSetting.TYPE_DUN, apnTypeMap);
        add(ApnSetting.TYPE_HIPRI, apnTypeMap);
        add(ApnSetting.TYPE_FOTA, apnTypeMap);
        add(ApnSetting.TYPE_IMS, apnTypeMap);
        add(ApnSetting.TYPE_CBS, apnTypeMap);
        add(ApnSetting.TYPE_IA, apnTypeMap);
        add(ApnSetting.TYPE_EMERGENCY, apnTypeMap);
        add(ApnSetting.TYPE_MCX, apnTypeMap);
        add(ApnSetting.TYPE_XCAP, apnTypeMap);
    }

    @NonNull
    private Map<Integer, Integer> getCarrierApnTypeMap(PersistableBundle carrierConfig) {
        if (carrierConfig == null) {
            Rlog.w(TAG, "carrier config is null");
            return new ArrayMap<>();
        }

        final String[] apnTypeConfig =
                carrierConfig.getStringArray(CarrierConfigManager.KEY_APN_PRIORITY_STRING_ARRAY);

        final Map<Integer, Integer> apnTypeMap = new ArrayMap<>();
        if (apnTypeConfig != null) {
            for (final String entry : apnTypeConfig) {
                try {
                    final String[] keyValue = entry.split(":");
                    if (keyValue.length != 2) {
                        Rlog.e(TAG, "Apn type entry must have exactly one ':'");
                    } else if (keyValue[0].contains(",")) {
                        //getApnTypesBitmaskFromString parses commas to a list, not valid here.
                        Rlog.e(TAG, "Invalid apn type name, entry: " + entry);
                    } else {
                        int apnTypeBitmask = ApnSetting.getApnTypesBitmaskFromString(keyValue[0]);
                        if (apnTypeBitmask > 0) {
                            apnTypeMap.put(apnTypeBitmask, Integer.parseInt(keyValue[1]));
                        } else {
                            Rlog.e(TAG, "Invalid apn type name, entry: " + entry);
                        }
                    }

                } catch (Exception ex) {
                    Rlog.e(TAG, "Exception on apn type entry: " + entry + "\n", ex);
                }
            }
        }
        return apnTypeMap;
    }

    private void add(@Annotation.ApnType int type, int priority) {
        mConfigTypeMap.put(type, new ApnConfigType(type, priority));
    private void add(@Annotation.ApnType int type, Map<Integer, Integer> apnTypeMap) {
        if (apnTypeMap.containsKey(type)) {
            mConfigTypeMap.put(type, new ApnConfigType(type, apnTypeMap.get(type)));
        }
    }
}
+13 −4
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ public class ApnContext {

    private DctConstants.State mState;

    private final int mPriority;
    private int mPriority;

    private ApnSetting mApnSetting;

@@ -160,6 +160,14 @@ public class ApnContext {
        return mPriority;
    }

    /**
     * Updates the priority of this context.
     * @param priority The priority of the APN type
     */
    public void setPriority(int priority) {
        mPriority = priority;
    }

    /**
     * Keeping for backwards compatibility and in case it's needed in the future
     * @return true
@@ -611,9 +619,10 @@ public class ApnContext {
    @Override
    public synchronized String toString() {
        // We don't print mDataConnection because its recursive.
        return "{mApnType=" + mApnType + " mState=" + getState() + " mWaitingApns={" +
                mRetryManager.getWaitingApns() + "}" + " mApnSetting={" + mApnSetting +
                "} mReason=" + mReason + " mDataEnabled=" + mDataEnabled + "}";
        return "{mApnType=" + mApnType + " mState=" + getState() + " mWaitingApns={"
                    + mRetryManager.getWaitingApns() + " priority=" + mPriority + "}"
                    + " mApnSetting={" + mApnSetting
                    + "} mReason=" + mReason + " mDataEnabled=" + mDataEnabled + "}";
    }

    private void log(String s) {
+4 −2
Original line number Diff line number Diff line
@@ -46,13 +46,15 @@ public class DcRequest implements Comparable<DcRequest> {
     * Create a DcRequest based off of the network request.  If the network request is not cellular,
     * then null is returned and a warning is generated.
     * @param networkRequest sets the type of dc request
     * @param apnConfigTypeRepository apn config types to match on the network request
     * @return corresponding DcRequest
     *
     */
    @Nullable
    public static DcRequest create(@NonNull final NetworkRequest networkRequest) {
    public static DcRequest create(@NonNull final NetworkRequest networkRequest,
            @NonNull final ApnConfigTypeRepository apnConfigTypeRepository) {
        final int apnType = ApnContext.getApnTypeFromNetworkRequest(networkRequest);
        final ApnConfigType apnConfigType = ApnConfigTypeRepository.getDefault().getByType(apnType);
        final ApnConfigType apnConfigType = apnConfigTypeRepository.getByType(apnType);
        if (apnConfigType == null) {
            Rlog.d(LOG_TAG, "Non cellular request ignored: " + networkRequest.toString());
            checkForAnomalousNetworkRequest(networkRequest);
Loading