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

Commit 8f145348 authored by Daniel Bright's avatar Daniel Bright Committed by Automerger Merge Worker
Browse files

Merge "Added configurable priority on apn types" am: 75c77f6a

Change-Id: I57378ea752c56d901b2f6fce03786e3c31cfdd52
parents f333d770 75c77f6a
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