Loading src/java/com/android/internal/telephony/PhoneSwitcher.java +21 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading @@ -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"); Loading @@ -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; Loading src/java/com/android/internal/telephony/dataconnection/ApnConfigType.java +5 −4 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } } src/java/com/android/internal/telephony/dataconnection/ApnConfigTypeRepository.java +67 −28 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); } /** Loading @@ -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))); } } } src/java/com/android/internal/telephony/dataconnection/ApnContext.java +13 −4 Original line number Diff line number Diff line Loading @@ -57,7 +57,7 @@ public class ApnContext { private DctConstants.State mState; private final int mPriority; private int mPriority; private ApnSetting mApnSetting; Loading Loading @@ -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 Loading Loading @@ -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) { Loading src/java/com/android/internal/telephony/dataconnection/DcRequest.java +4 −2 Original line number Diff line number Diff line Loading @@ -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 Loading
src/java/com/android/internal/telephony/PhoneSwitcher.java +21 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading @@ -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"); Loading @@ -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; Loading
src/java/com/android/internal/telephony/dataconnection/ApnConfigType.java +5 −4 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } }
src/java/com/android/internal/telephony/dataconnection/ApnConfigTypeRepository.java +67 −28 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); } /** Loading @@ -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))); } } }
src/java/com/android/internal/telephony/dataconnection/ApnContext.java +13 −4 Original line number Diff line number Diff line Loading @@ -57,7 +57,7 @@ public class ApnContext { private DctConstants.State mState; private final int mPriority; private int mPriority; private ApnSetting mApnSetting; Loading Loading @@ -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 Loading Loading @@ -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) { Loading
src/java/com/android/internal/telephony/dataconnection/DcRequest.java +4 −2 Original line number Diff line number Diff line Loading @@ -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