Loading src/java/com/android/internal/telephony/dataconnection/ApnContext.java +46 −112 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.net.NetworkConfig; import android.net.NetworkRequest; import android.telephony.Rlog; import android.telephony.data.ApnSetting; import android.telephony.data.ApnSetting.ApnType; import android.text.TextUtils; import android.util.LocalLog; import android.util.SparseIntArray; Loading @@ -30,7 +31,6 @@ import android.util.SparseIntArray; import com.android.internal.R; import com.android.internal.telephony.DctConstants; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.RetryManager; import com.android.internal.util.IndentingPrintWriter; Loading Loading @@ -427,7 +427,7 @@ public class ApnContext { } else { mLocalLogs.add(log); mNetworkRequests.add(networkRequest); mDcTracker.setEnabled(apnIdForApnName(mApnType), true); mDcTracker.setEnabled(ApnSetting.getApnTypesBitmaskFromString(mApnType), true); } } } Loading @@ -447,7 +447,7 @@ public class ApnContext { log.log("ApnContext.releaseNetwork left with " + mNetworkRequests.size() + " requests."); if (mNetworkRequests.size() == 0) { mDcTracker.setEnabled(apnIdForApnName(mApnType), false); mDcTracker.setEnabled(ApnSetting.getApnTypesBitmaskFromString(mApnType), false); } } } Loading Loading @@ -549,88 +549,78 @@ public class ApnContext { return mRetryManager.getRetryAfterDisconnectDelay(); } public static int apnIdForType(int networkType) { public static int getApnTypeFromNetworkType(int networkType) { switch (networkType) { case ConnectivityManager.TYPE_MOBILE: return DctConstants.APN_DEFAULT_ID; return ApnSetting.TYPE_DEFAULT; case ConnectivityManager.TYPE_MOBILE_MMS: return DctConstants.APN_MMS_ID; return ApnSetting.TYPE_MMS; case ConnectivityManager.TYPE_MOBILE_SUPL: return DctConstants.APN_SUPL_ID; return ApnSetting.TYPE_SUPL; case ConnectivityManager.TYPE_MOBILE_DUN: return DctConstants.APN_DUN_ID; return ApnSetting.TYPE_DUN; case ConnectivityManager.TYPE_MOBILE_FOTA: return DctConstants.APN_FOTA_ID; return ApnSetting.TYPE_FOTA; case ConnectivityManager.TYPE_MOBILE_IMS: return DctConstants.APN_IMS_ID; return ApnSetting.TYPE_IMS; case ConnectivityManager.TYPE_MOBILE_CBS: return DctConstants.APN_CBS_ID; return ApnSetting.TYPE_CBS; case ConnectivityManager.TYPE_MOBILE_IA: return DctConstants.APN_IA_ID; return ApnSetting.TYPE_IA; case ConnectivityManager.TYPE_MOBILE_EMERGENCY: return DctConstants.APN_EMERGENCY_ID; return ApnSetting.TYPE_EMERGENCY; default: return DctConstants.APN_INVALID_ID; return ApnSetting.TYPE_NONE; } } public static int apnIdForNetworkRequest(NetworkRequest nr) { static @ApnType int getApnTypeFromNetworkRequest(NetworkRequest nr) { NetworkCapabilities nc = nr.networkCapabilities; // For now, ignore the bandwidth stuff if (nc.getTransportTypes().length > 0 && nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == false) { return DctConstants.APN_INVALID_ID; return ApnSetting.TYPE_NONE; } // in the near term just do 1-1 matches. // TODO - actually try to match the set of capabilities int apnId = DctConstants.APN_INVALID_ID; int apnType = ApnSetting.TYPE_NONE; boolean error = false; if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) { apnId = DctConstants.APN_DEFAULT_ID; apnType = ApnSetting.TYPE_DEFAULT; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_MMS_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_MMS; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_SUPL)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_SUPL_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_SUPL; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_DUN)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_DUN_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_DUN; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_FOTA)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_FOTA_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_FOTA; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_IMS_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_IMS; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_CBS)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_CBS_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_CBS; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IA)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_IA_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_RCS)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; Rlog.d(SLOG_TAG, "RCS APN type not yet supported"); } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_XCAP)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; Rlog.d(SLOG_TAG, "XCAP APN type not yet supported"); if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_IA; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_EIMS)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_EMERGENCY_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_EMERGENCY; } if (error) { // TODO: If this error condition is removed, the framework's handling of Loading @@ -639,66 +629,10 @@ public class ApnContext { // NetworkCapabilities.maybeMarkCapabilitiesRestricted currently works. Rlog.d(SLOG_TAG, "Multiple apn types specified in request - result is unspecified!"); } if (apnId == DctConstants.APN_INVALID_ID) { if (apnType == ApnSetting.TYPE_NONE) { Rlog.d(SLOG_TAG, "Unsupported NetworkRequest in Telephony: nr=" + nr); } return apnId; } // TODO - kill The use of these strings public static int apnIdForApnName(String type) { switch (type) { case PhoneConstants.APN_TYPE_DEFAULT: return DctConstants.APN_DEFAULT_ID; case PhoneConstants.APN_TYPE_MMS: return DctConstants.APN_MMS_ID; case PhoneConstants.APN_TYPE_SUPL: return DctConstants.APN_SUPL_ID; case PhoneConstants.APN_TYPE_DUN: return DctConstants.APN_DUN_ID; case PhoneConstants.APN_TYPE_HIPRI: return DctConstants.APN_HIPRI_ID; case PhoneConstants.APN_TYPE_IMS: return DctConstants.APN_IMS_ID; case PhoneConstants.APN_TYPE_FOTA: return DctConstants.APN_FOTA_ID; case PhoneConstants.APN_TYPE_CBS: return DctConstants.APN_CBS_ID; case PhoneConstants.APN_TYPE_IA: return DctConstants.APN_IA_ID; case PhoneConstants.APN_TYPE_EMERGENCY: return DctConstants.APN_EMERGENCY_ID; default: return DctConstants.APN_INVALID_ID; } } private static String apnNameForApnId(int id) { switch (id) { case DctConstants.APN_DEFAULT_ID: return PhoneConstants.APN_TYPE_DEFAULT; case DctConstants.APN_MMS_ID: return PhoneConstants.APN_TYPE_MMS; case DctConstants.APN_SUPL_ID: return PhoneConstants.APN_TYPE_SUPL; case DctConstants.APN_DUN_ID: return PhoneConstants.APN_TYPE_DUN; case DctConstants.APN_HIPRI_ID: return PhoneConstants.APN_TYPE_HIPRI; case DctConstants.APN_IMS_ID: return PhoneConstants.APN_TYPE_IMS; case DctConstants.APN_FOTA_ID: return PhoneConstants.APN_TYPE_FOTA; case DctConstants.APN_CBS_ID: return PhoneConstants.APN_TYPE_CBS; case DctConstants.APN_IA_ID: return PhoneConstants.APN_TYPE_IA; case DctConstants.APN_EMERGENCY_ID: return PhoneConstants.APN_TYPE_EMERGENCY; default: Rlog.d(SLOG_TAG, "Unknown id (" + id + ") in apnIdToType"); return PhoneConstants.APN_TYPE_DEFAULT; } return apnType; } @Override Loading src/java/com/android/internal/telephony/dataconnection/DcRequest.java +9 −97 Original line number Diff line number Diff line Loading @@ -15,22 +15,10 @@ */ package com.android.internal.telephony.dataconnection; import static com.android.internal.telephony.DctConstants.APN_CBS_ID; import static com.android.internal.telephony.DctConstants.APN_DEFAULT_ID; import static com.android.internal.telephony.DctConstants.APN_DUN_ID; import static com.android.internal.telephony.DctConstants.APN_EMERGENCY_ID; import static com.android.internal.telephony.DctConstants.APN_FOTA_ID; import static com.android.internal.telephony.DctConstants.APN_IA_ID; import static com.android.internal.telephony.DctConstants.APN_IMS_ID; import static com.android.internal.telephony.DctConstants.APN_INVALID_ID; import static com.android.internal.telephony.DctConstants.APN_MMS_ID; import static com.android.internal.telephony.DctConstants.APN_SUPL_ID; import android.content.Context; import android.net.NetworkCapabilities; import android.net.NetworkConfig; import android.net.NetworkRequest; import android.telephony.Rlog; import android.telephony.data.ApnSetting.ApnType; import java.util.HashMap; Loading @@ -39,17 +27,17 @@ public class DcRequest implements Comparable<DcRequest> { public final NetworkRequest networkRequest; public final int priority; public final int apnId; public final @ApnType int apnType; public DcRequest(NetworkRequest nr, Context context) { initApnPriorities(context); networkRequest = nr; apnId = apnIdForNetworkRequest(networkRequest); priority = priorityForApnId(apnId); apnType = ApnContext.getApnTypeFromNetworkRequest(networkRequest); priority = priorityForApnType(apnType); } public String toString() { return networkRequest.toString() + ", priority=" + priority + ", apnId=" + apnId; return networkRequest.toString() + ", priority=" + priority + ", apnType=" + apnType; } public int hashCode() { Loading @@ -67,78 +55,6 @@ public class DcRequest implements Comparable<DcRequest> { return o.priority - priority; } private int apnIdForNetworkRequest(NetworkRequest nr) { NetworkCapabilities nc = nr.networkCapabilities; // For now, ignore the bandwidth stuff if (nc.getTransportTypes().length > 0 && nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == false) { return APN_INVALID_ID; } // in the near term just do 1-1 matches. // TODO - actually try to match the set of capabilities int apnId = APN_INVALID_ID; boolean error = false; if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_DEFAULT_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_MMS_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_SUPL)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_SUPL_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_DUN)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_DUN_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_FOTA)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_FOTA_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_IMS_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_CBS)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_CBS_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IA)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_IA_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_RCS)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_INVALID_ID; loge("RCS APN type not yet supported"); } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_XCAP)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_INVALID_ID; loge("XCAP APN type not yet supported"); } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_EIMS)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_EMERGENCY_ID; } if (error) { // TODO: If this error condition is removed, the framework's handling of // NET_CAPABILITY_NOT_RESTRICTED will need to be updated so requests for // say FOTA and INTERNET are marked as restricted. This is not how // NetworkCapabilities.maybeMarkCapabilitiesRestricted currently works. loge("Multiple apn types specified in request - result is unspecified!"); } if (apnId == APN_INVALID_ID) { loge("Unsupported NetworkRequest in Telephony: nr=" + nr); } return apnId; } private static final HashMap<Integer, Integer> sApnPriorityMap = new HashMap<Integer, Integer>(); Loading @@ -149,19 +65,15 @@ public class DcRequest implements Comparable<DcRequest> { com.android.internal.R.array.networkAttributes); for (String networkConfigString : networkConfigStrings) { NetworkConfig networkConfig = new NetworkConfig(networkConfigString); final int apnId = ApnContext.apnIdForType(networkConfig.type); sApnPriorityMap.put(apnId, networkConfig.priority); final int apnType = ApnContext.getApnTypeFromNetworkType(networkConfig.type); sApnPriorityMap.put(apnType, networkConfig.priority); } } } } private int priorityForApnId(int apnId) { Integer priority = sApnPriorityMap.get(apnId); private int priorityForApnType(int apnType) { Integer priority = sApnPriorityMap.get(apnType); return (priority != null ? priority.intValue() : 0); } private void loge(String s) { Rlog.e(LOG_TAG, s); } } src/java/com/android/internal/telephony/dataconnection/DcTracker.java +18 −39 Original line number Diff line number Diff line Loading @@ -503,7 +503,7 @@ public class DcTracker extends Handler { private final ConcurrentHashMap<String, ApnContext> mApnContexts = new ConcurrentHashMap<String, ApnContext>(); private final SparseArray<ApnContext> mApnContextsById = new SparseArray<ApnContext>(); private final SparseArray<ApnContext> mApnContextsByType = new SparseArray<ApnContext>(); private int mDisconnectPendingCount = 0; Loading Loading @@ -731,7 +731,7 @@ public class DcTracker extends Handler { mPhone.getContext().getContentResolver().unregisterContentObserver(mApnObserver); mApnContexts.clear(); mApnContextsById.clear(); mApnContextsByType.clear(); mPrioritySortedApnContexts.clear(); unregisterForAllEvents(); Loading Loading @@ -868,40 +868,19 @@ public class DcTracker extends Handler { } public void requestNetwork(NetworkRequest networkRequest, LocalLog log) { final int apnId = ApnContext.apnIdForNetworkRequest(networkRequest); final ApnContext apnContext = mApnContextsById.get(apnId); final int apnType = ApnContext.getApnTypeFromNetworkRequest(networkRequest); final ApnContext apnContext = mApnContextsByType.get(apnType); log.log("DcTracker.requestNetwork for " + networkRequest + " found " + apnContext); if (apnContext != null) apnContext.requestNetwork(networkRequest, log); } public void releaseNetwork(NetworkRequest networkRequest, LocalLog log) { final int apnId = ApnContext.apnIdForNetworkRequest(networkRequest); final ApnContext apnContext = mApnContextsById.get(apnId); final int apnType = ApnContext.getApnTypeFromNetworkRequest(networkRequest); final ApnContext apnContext = mApnContextsByType.get(apnType); log.log("DcTracker.releaseNetwork for " + networkRequest + " found " + apnContext); if (apnContext != null) apnContext.releaseNetwork(networkRequest, log); } public boolean isApnSupported(String name) { if (name == null) { loge("isApnSupported: name=null"); return false; } ApnContext apnContext = mApnContexts.get(name); if (apnContext == null) { loge("Request for unsupported mobile name: " + name); return false; } return true; } public int getApnPriority(String name) { ApnContext apnContext = mApnContexts.get(name); if (apnContext == null) { loge("Request for unsupported mobile name: " + name); } return apnContext.priority; } // Turn telephony radio on or off. private void setRadio(boolean on) { final ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); Loading Loading @@ -972,7 +951,7 @@ public class DcTracker extends Handler { private ApnContext addApnContext(String type, NetworkConfig networkConfig) { ApnContext apnContext = new ApnContext(mPhone, type, LOG_TAG, networkConfig, this); mApnContexts.put(type, apnContext); mApnContextsById.put(ApnContext.apnIdForApnName(type), apnContext); mApnContextsByType.put(ApnSetting.getApnTypesBitmaskFromString(type), apnContext); mPrioritySortedApnContexts.add(apnContext); return apnContext; } Loading Loading @@ -2476,17 +2455,17 @@ public class DcTracker extends Handler { return null; } public void setEnabled(int id, boolean enable) { public void setEnabled(int apnType, boolean enable) { Message msg = obtainMessage(DctConstants.EVENT_ENABLE_NEW_APN); msg.arg1 = id; msg.arg1 = apnType; msg.arg2 = (enable ? DctConstants.ENABLED : DctConstants.DISABLED); sendMessage(msg); } private void onEnableApn(int apnId, int enabled) { ApnContext apnContext = mApnContextsById.get(apnId); private void onEnableApn(int apnType, int enabled) { ApnContext apnContext = mApnContextsByType.get(apnType); if (apnContext == null) { loge("onEnableApn(" + apnId + ", " + enabled + "): NO ApnContext"); loge("onEnableApn(" + apnType + ", " + enabled + "): NO ApnContext"); return; } // TODO change our retry manager to use the appropriate numbers for the new APN Loading Loading @@ -3181,9 +3160,9 @@ public class DcTracker extends Handler { setupDataOnConnectableApns(Phone.REASON_VOICE_CALL_ENDED); } private void onCleanUpConnection(boolean tearDown, int apnId, String reason) { private void onCleanUpConnection(boolean tearDown, int apnType, String reason) { if (DBG) log("onCleanUpConnection"); ApnContext apnContext = mApnContextsById.get(apnId); ApnContext apnContext = mApnContextsByType.get(apnType); if (apnContext != null) { apnContext.setReason(reason); cleanUpConnection(tearDown, apnContext); Loading Loading @@ -3647,7 +3626,7 @@ public class DcTracker extends Handler { cleanUpAllConnections(false, Phone.REASON_PS_RESTRICT_ENABLED); mReregisterOnReconnectFailure = false; } ApnContext apnContext = mApnContextsById.get(DctConstants.APN_DEFAULT_ID); ApnContext apnContext = mApnContextsByType.get(ApnSetting.TYPE_DEFAULT); if (apnContext != null) { apnContext.setReason(Phone.REASON_PS_RESTRICT_ENABLED); trySetupData(apnContext); Loading Loading @@ -3850,7 +3829,7 @@ public class DcTracker extends Handler { } case DctConstants.EVENT_PROVISIONING_APN_ALARM: { if (DBG) log("EVENT_PROVISIONING_APN_ALARM"); ApnContext apnCtx = mApnContextsById.get(DctConstants.APN_DEFAULT_ID); ApnContext apnCtx = mApnContextsByType.get(ApnSetting.TYPE_DEFAULT); if (apnCtx.isProvisioningApn() && apnCtx.isConnectedOrConnecting()) { if (mProvisioningApnAlarmTag == msg.arg1) { if (DBG) log("EVENT_PROVISIONING_APN_ALARM: Disconnecting"); Loading Loading @@ -4205,9 +4184,9 @@ public class DcTracker extends Handler { } if (TextUtils.equals(apnType, PhoneConstants.APN_TYPE_EMERGENCY)) { apnContext = mApnContextsById.get(DctConstants.APN_EMERGENCY_ID); apnContext = mApnContextsByType.get(ApnSetting.TYPE_EMERGENCY); } else if (TextUtils.equals(apnType, PhoneConstants.APN_TYPE_IMS)) { apnContext = mApnContextsById.get(DctConstants.APN_IMS_ID); apnContext = mApnContextsByType.get(ApnSetting.TYPE_IMS); } else { log("apnType is invalid, return null"); return null; Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/ApnContextTest.java +4 −4 Original line number Diff line number Diff line Loading @@ -143,14 +143,14 @@ public class ApnContextTest extends TelephonyTest { NetworkRequest nr = new NetworkRequest.Builder().build(); mApnContext.requestNetwork(nr, log); verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(true)); verify(mDcTracker, times(1)).setEnabled(eq(ApnSetting.TYPE_DEFAULT), eq(true)); mApnContext.requestNetwork(nr, log); verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(true)); verify(mDcTracker, times(1)).setEnabled(eq(ApnSetting.TYPE_DEFAULT), eq(true)); mApnContext.releaseNetwork(nr, log); verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(false)); verify(mDcTracker, times(1)).setEnabled(eq(ApnSetting.TYPE_DEFAULT), eq(false)); mApnContext.releaseNetwork(nr, log); verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(false)); verify(mDcTracker, times(1)).setEnabled(eq(ApnSetting.TYPE_DEFAULT), eq(false)); } @Test Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java +12 −12 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
src/java/com/android/internal/telephony/dataconnection/ApnContext.java +46 −112 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.net.NetworkConfig; import android.net.NetworkRequest; import android.telephony.Rlog; import android.telephony.data.ApnSetting; import android.telephony.data.ApnSetting.ApnType; import android.text.TextUtils; import android.util.LocalLog; import android.util.SparseIntArray; Loading @@ -30,7 +31,6 @@ import android.util.SparseIntArray; import com.android.internal.R; import com.android.internal.telephony.DctConstants; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.RetryManager; import com.android.internal.util.IndentingPrintWriter; Loading Loading @@ -427,7 +427,7 @@ public class ApnContext { } else { mLocalLogs.add(log); mNetworkRequests.add(networkRequest); mDcTracker.setEnabled(apnIdForApnName(mApnType), true); mDcTracker.setEnabled(ApnSetting.getApnTypesBitmaskFromString(mApnType), true); } } } Loading @@ -447,7 +447,7 @@ public class ApnContext { log.log("ApnContext.releaseNetwork left with " + mNetworkRequests.size() + " requests."); if (mNetworkRequests.size() == 0) { mDcTracker.setEnabled(apnIdForApnName(mApnType), false); mDcTracker.setEnabled(ApnSetting.getApnTypesBitmaskFromString(mApnType), false); } } } Loading Loading @@ -549,88 +549,78 @@ public class ApnContext { return mRetryManager.getRetryAfterDisconnectDelay(); } public static int apnIdForType(int networkType) { public static int getApnTypeFromNetworkType(int networkType) { switch (networkType) { case ConnectivityManager.TYPE_MOBILE: return DctConstants.APN_DEFAULT_ID; return ApnSetting.TYPE_DEFAULT; case ConnectivityManager.TYPE_MOBILE_MMS: return DctConstants.APN_MMS_ID; return ApnSetting.TYPE_MMS; case ConnectivityManager.TYPE_MOBILE_SUPL: return DctConstants.APN_SUPL_ID; return ApnSetting.TYPE_SUPL; case ConnectivityManager.TYPE_MOBILE_DUN: return DctConstants.APN_DUN_ID; return ApnSetting.TYPE_DUN; case ConnectivityManager.TYPE_MOBILE_FOTA: return DctConstants.APN_FOTA_ID; return ApnSetting.TYPE_FOTA; case ConnectivityManager.TYPE_MOBILE_IMS: return DctConstants.APN_IMS_ID; return ApnSetting.TYPE_IMS; case ConnectivityManager.TYPE_MOBILE_CBS: return DctConstants.APN_CBS_ID; return ApnSetting.TYPE_CBS; case ConnectivityManager.TYPE_MOBILE_IA: return DctConstants.APN_IA_ID; return ApnSetting.TYPE_IA; case ConnectivityManager.TYPE_MOBILE_EMERGENCY: return DctConstants.APN_EMERGENCY_ID; return ApnSetting.TYPE_EMERGENCY; default: return DctConstants.APN_INVALID_ID; return ApnSetting.TYPE_NONE; } } public static int apnIdForNetworkRequest(NetworkRequest nr) { static @ApnType int getApnTypeFromNetworkRequest(NetworkRequest nr) { NetworkCapabilities nc = nr.networkCapabilities; // For now, ignore the bandwidth stuff if (nc.getTransportTypes().length > 0 && nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == false) { return DctConstants.APN_INVALID_ID; return ApnSetting.TYPE_NONE; } // in the near term just do 1-1 matches. // TODO - actually try to match the set of capabilities int apnId = DctConstants.APN_INVALID_ID; int apnType = ApnSetting.TYPE_NONE; boolean error = false; if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) { apnId = DctConstants.APN_DEFAULT_ID; apnType = ApnSetting.TYPE_DEFAULT; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_MMS_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_MMS; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_SUPL)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_SUPL_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_SUPL; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_DUN)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_DUN_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_DUN; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_FOTA)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_FOTA_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_FOTA; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_IMS_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_IMS; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_CBS)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_CBS_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_CBS; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IA)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_IA_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_RCS)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; Rlog.d(SLOG_TAG, "RCS APN type not yet supported"); } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_XCAP)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; Rlog.d(SLOG_TAG, "XCAP APN type not yet supported"); if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_IA; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_EIMS)) { if (apnId != DctConstants.APN_INVALID_ID) error = true; apnId = DctConstants.APN_EMERGENCY_ID; if (apnType != ApnSetting.TYPE_NONE) error = true; apnType = ApnSetting.TYPE_EMERGENCY; } if (error) { // TODO: If this error condition is removed, the framework's handling of Loading @@ -639,66 +629,10 @@ public class ApnContext { // NetworkCapabilities.maybeMarkCapabilitiesRestricted currently works. Rlog.d(SLOG_TAG, "Multiple apn types specified in request - result is unspecified!"); } if (apnId == DctConstants.APN_INVALID_ID) { if (apnType == ApnSetting.TYPE_NONE) { Rlog.d(SLOG_TAG, "Unsupported NetworkRequest in Telephony: nr=" + nr); } return apnId; } // TODO - kill The use of these strings public static int apnIdForApnName(String type) { switch (type) { case PhoneConstants.APN_TYPE_DEFAULT: return DctConstants.APN_DEFAULT_ID; case PhoneConstants.APN_TYPE_MMS: return DctConstants.APN_MMS_ID; case PhoneConstants.APN_TYPE_SUPL: return DctConstants.APN_SUPL_ID; case PhoneConstants.APN_TYPE_DUN: return DctConstants.APN_DUN_ID; case PhoneConstants.APN_TYPE_HIPRI: return DctConstants.APN_HIPRI_ID; case PhoneConstants.APN_TYPE_IMS: return DctConstants.APN_IMS_ID; case PhoneConstants.APN_TYPE_FOTA: return DctConstants.APN_FOTA_ID; case PhoneConstants.APN_TYPE_CBS: return DctConstants.APN_CBS_ID; case PhoneConstants.APN_TYPE_IA: return DctConstants.APN_IA_ID; case PhoneConstants.APN_TYPE_EMERGENCY: return DctConstants.APN_EMERGENCY_ID; default: return DctConstants.APN_INVALID_ID; } } private static String apnNameForApnId(int id) { switch (id) { case DctConstants.APN_DEFAULT_ID: return PhoneConstants.APN_TYPE_DEFAULT; case DctConstants.APN_MMS_ID: return PhoneConstants.APN_TYPE_MMS; case DctConstants.APN_SUPL_ID: return PhoneConstants.APN_TYPE_SUPL; case DctConstants.APN_DUN_ID: return PhoneConstants.APN_TYPE_DUN; case DctConstants.APN_HIPRI_ID: return PhoneConstants.APN_TYPE_HIPRI; case DctConstants.APN_IMS_ID: return PhoneConstants.APN_TYPE_IMS; case DctConstants.APN_FOTA_ID: return PhoneConstants.APN_TYPE_FOTA; case DctConstants.APN_CBS_ID: return PhoneConstants.APN_TYPE_CBS; case DctConstants.APN_IA_ID: return PhoneConstants.APN_TYPE_IA; case DctConstants.APN_EMERGENCY_ID: return PhoneConstants.APN_TYPE_EMERGENCY; default: Rlog.d(SLOG_TAG, "Unknown id (" + id + ") in apnIdToType"); return PhoneConstants.APN_TYPE_DEFAULT; } return apnType; } @Override Loading
src/java/com/android/internal/telephony/dataconnection/DcRequest.java +9 −97 Original line number Diff line number Diff line Loading @@ -15,22 +15,10 @@ */ package com.android.internal.telephony.dataconnection; import static com.android.internal.telephony.DctConstants.APN_CBS_ID; import static com.android.internal.telephony.DctConstants.APN_DEFAULT_ID; import static com.android.internal.telephony.DctConstants.APN_DUN_ID; import static com.android.internal.telephony.DctConstants.APN_EMERGENCY_ID; import static com.android.internal.telephony.DctConstants.APN_FOTA_ID; import static com.android.internal.telephony.DctConstants.APN_IA_ID; import static com.android.internal.telephony.DctConstants.APN_IMS_ID; import static com.android.internal.telephony.DctConstants.APN_INVALID_ID; import static com.android.internal.telephony.DctConstants.APN_MMS_ID; import static com.android.internal.telephony.DctConstants.APN_SUPL_ID; import android.content.Context; import android.net.NetworkCapabilities; import android.net.NetworkConfig; import android.net.NetworkRequest; import android.telephony.Rlog; import android.telephony.data.ApnSetting.ApnType; import java.util.HashMap; Loading @@ -39,17 +27,17 @@ public class DcRequest implements Comparable<DcRequest> { public final NetworkRequest networkRequest; public final int priority; public final int apnId; public final @ApnType int apnType; public DcRequest(NetworkRequest nr, Context context) { initApnPriorities(context); networkRequest = nr; apnId = apnIdForNetworkRequest(networkRequest); priority = priorityForApnId(apnId); apnType = ApnContext.getApnTypeFromNetworkRequest(networkRequest); priority = priorityForApnType(apnType); } public String toString() { return networkRequest.toString() + ", priority=" + priority + ", apnId=" + apnId; return networkRequest.toString() + ", priority=" + priority + ", apnType=" + apnType; } public int hashCode() { Loading @@ -67,78 +55,6 @@ public class DcRequest implements Comparable<DcRequest> { return o.priority - priority; } private int apnIdForNetworkRequest(NetworkRequest nr) { NetworkCapabilities nc = nr.networkCapabilities; // For now, ignore the bandwidth stuff if (nc.getTransportTypes().length > 0 && nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == false) { return APN_INVALID_ID; } // in the near term just do 1-1 matches. // TODO - actually try to match the set of capabilities int apnId = APN_INVALID_ID; boolean error = false; if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_DEFAULT_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_MMS_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_SUPL)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_SUPL_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_DUN)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_DUN_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_FOTA)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_FOTA_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_IMS_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_CBS)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_CBS_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IA)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_IA_ID; } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_RCS)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_INVALID_ID; loge("RCS APN type not yet supported"); } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_XCAP)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_INVALID_ID; loge("XCAP APN type not yet supported"); } if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_EIMS)) { if (apnId != APN_INVALID_ID) error = true; apnId = APN_EMERGENCY_ID; } if (error) { // TODO: If this error condition is removed, the framework's handling of // NET_CAPABILITY_NOT_RESTRICTED will need to be updated so requests for // say FOTA and INTERNET are marked as restricted. This is not how // NetworkCapabilities.maybeMarkCapabilitiesRestricted currently works. loge("Multiple apn types specified in request - result is unspecified!"); } if (apnId == APN_INVALID_ID) { loge("Unsupported NetworkRequest in Telephony: nr=" + nr); } return apnId; } private static final HashMap<Integer, Integer> sApnPriorityMap = new HashMap<Integer, Integer>(); Loading @@ -149,19 +65,15 @@ public class DcRequest implements Comparable<DcRequest> { com.android.internal.R.array.networkAttributes); for (String networkConfigString : networkConfigStrings) { NetworkConfig networkConfig = new NetworkConfig(networkConfigString); final int apnId = ApnContext.apnIdForType(networkConfig.type); sApnPriorityMap.put(apnId, networkConfig.priority); final int apnType = ApnContext.getApnTypeFromNetworkType(networkConfig.type); sApnPriorityMap.put(apnType, networkConfig.priority); } } } } private int priorityForApnId(int apnId) { Integer priority = sApnPriorityMap.get(apnId); private int priorityForApnType(int apnType) { Integer priority = sApnPriorityMap.get(apnType); return (priority != null ? priority.intValue() : 0); } private void loge(String s) { Rlog.e(LOG_TAG, s); } }
src/java/com/android/internal/telephony/dataconnection/DcTracker.java +18 −39 Original line number Diff line number Diff line Loading @@ -503,7 +503,7 @@ public class DcTracker extends Handler { private final ConcurrentHashMap<String, ApnContext> mApnContexts = new ConcurrentHashMap<String, ApnContext>(); private final SparseArray<ApnContext> mApnContextsById = new SparseArray<ApnContext>(); private final SparseArray<ApnContext> mApnContextsByType = new SparseArray<ApnContext>(); private int mDisconnectPendingCount = 0; Loading Loading @@ -731,7 +731,7 @@ public class DcTracker extends Handler { mPhone.getContext().getContentResolver().unregisterContentObserver(mApnObserver); mApnContexts.clear(); mApnContextsById.clear(); mApnContextsByType.clear(); mPrioritySortedApnContexts.clear(); unregisterForAllEvents(); Loading Loading @@ -868,40 +868,19 @@ public class DcTracker extends Handler { } public void requestNetwork(NetworkRequest networkRequest, LocalLog log) { final int apnId = ApnContext.apnIdForNetworkRequest(networkRequest); final ApnContext apnContext = mApnContextsById.get(apnId); final int apnType = ApnContext.getApnTypeFromNetworkRequest(networkRequest); final ApnContext apnContext = mApnContextsByType.get(apnType); log.log("DcTracker.requestNetwork for " + networkRequest + " found " + apnContext); if (apnContext != null) apnContext.requestNetwork(networkRequest, log); } public void releaseNetwork(NetworkRequest networkRequest, LocalLog log) { final int apnId = ApnContext.apnIdForNetworkRequest(networkRequest); final ApnContext apnContext = mApnContextsById.get(apnId); final int apnType = ApnContext.getApnTypeFromNetworkRequest(networkRequest); final ApnContext apnContext = mApnContextsByType.get(apnType); log.log("DcTracker.releaseNetwork for " + networkRequest + " found " + apnContext); if (apnContext != null) apnContext.releaseNetwork(networkRequest, log); } public boolean isApnSupported(String name) { if (name == null) { loge("isApnSupported: name=null"); return false; } ApnContext apnContext = mApnContexts.get(name); if (apnContext == null) { loge("Request for unsupported mobile name: " + name); return false; } return true; } public int getApnPriority(String name) { ApnContext apnContext = mApnContexts.get(name); if (apnContext == null) { loge("Request for unsupported mobile name: " + name); } return apnContext.priority; } // Turn telephony radio on or off. private void setRadio(boolean on) { final ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); Loading Loading @@ -972,7 +951,7 @@ public class DcTracker extends Handler { private ApnContext addApnContext(String type, NetworkConfig networkConfig) { ApnContext apnContext = new ApnContext(mPhone, type, LOG_TAG, networkConfig, this); mApnContexts.put(type, apnContext); mApnContextsById.put(ApnContext.apnIdForApnName(type), apnContext); mApnContextsByType.put(ApnSetting.getApnTypesBitmaskFromString(type), apnContext); mPrioritySortedApnContexts.add(apnContext); return apnContext; } Loading Loading @@ -2476,17 +2455,17 @@ public class DcTracker extends Handler { return null; } public void setEnabled(int id, boolean enable) { public void setEnabled(int apnType, boolean enable) { Message msg = obtainMessage(DctConstants.EVENT_ENABLE_NEW_APN); msg.arg1 = id; msg.arg1 = apnType; msg.arg2 = (enable ? DctConstants.ENABLED : DctConstants.DISABLED); sendMessage(msg); } private void onEnableApn(int apnId, int enabled) { ApnContext apnContext = mApnContextsById.get(apnId); private void onEnableApn(int apnType, int enabled) { ApnContext apnContext = mApnContextsByType.get(apnType); if (apnContext == null) { loge("onEnableApn(" + apnId + ", " + enabled + "): NO ApnContext"); loge("onEnableApn(" + apnType + ", " + enabled + "): NO ApnContext"); return; } // TODO change our retry manager to use the appropriate numbers for the new APN Loading Loading @@ -3181,9 +3160,9 @@ public class DcTracker extends Handler { setupDataOnConnectableApns(Phone.REASON_VOICE_CALL_ENDED); } private void onCleanUpConnection(boolean tearDown, int apnId, String reason) { private void onCleanUpConnection(boolean tearDown, int apnType, String reason) { if (DBG) log("onCleanUpConnection"); ApnContext apnContext = mApnContextsById.get(apnId); ApnContext apnContext = mApnContextsByType.get(apnType); if (apnContext != null) { apnContext.setReason(reason); cleanUpConnection(tearDown, apnContext); Loading Loading @@ -3647,7 +3626,7 @@ public class DcTracker extends Handler { cleanUpAllConnections(false, Phone.REASON_PS_RESTRICT_ENABLED); mReregisterOnReconnectFailure = false; } ApnContext apnContext = mApnContextsById.get(DctConstants.APN_DEFAULT_ID); ApnContext apnContext = mApnContextsByType.get(ApnSetting.TYPE_DEFAULT); if (apnContext != null) { apnContext.setReason(Phone.REASON_PS_RESTRICT_ENABLED); trySetupData(apnContext); Loading Loading @@ -3850,7 +3829,7 @@ public class DcTracker extends Handler { } case DctConstants.EVENT_PROVISIONING_APN_ALARM: { if (DBG) log("EVENT_PROVISIONING_APN_ALARM"); ApnContext apnCtx = mApnContextsById.get(DctConstants.APN_DEFAULT_ID); ApnContext apnCtx = mApnContextsByType.get(ApnSetting.TYPE_DEFAULT); if (apnCtx.isProvisioningApn() && apnCtx.isConnectedOrConnecting()) { if (mProvisioningApnAlarmTag == msg.arg1) { if (DBG) log("EVENT_PROVISIONING_APN_ALARM: Disconnecting"); Loading Loading @@ -4205,9 +4184,9 @@ public class DcTracker extends Handler { } if (TextUtils.equals(apnType, PhoneConstants.APN_TYPE_EMERGENCY)) { apnContext = mApnContextsById.get(DctConstants.APN_EMERGENCY_ID); apnContext = mApnContextsByType.get(ApnSetting.TYPE_EMERGENCY); } else if (TextUtils.equals(apnType, PhoneConstants.APN_TYPE_IMS)) { apnContext = mApnContextsById.get(DctConstants.APN_IMS_ID); apnContext = mApnContextsByType.get(ApnSetting.TYPE_IMS); } else { log("apnType is invalid, return null"); return null; Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/ApnContextTest.java +4 −4 Original line number Diff line number Diff line Loading @@ -143,14 +143,14 @@ public class ApnContextTest extends TelephonyTest { NetworkRequest nr = new NetworkRequest.Builder().build(); mApnContext.requestNetwork(nr, log); verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(true)); verify(mDcTracker, times(1)).setEnabled(eq(ApnSetting.TYPE_DEFAULT), eq(true)); mApnContext.requestNetwork(nr, log); verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(true)); verify(mDcTracker, times(1)).setEnabled(eq(ApnSetting.TYPE_DEFAULT), eq(true)); mApnContext.releaseNetwork(nr, log); verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(false)); verify(mDcTracker, times(1)).setEnabled(eq(ApnSetting.TYPE_DEFAULT), eq(false)); mApnContext.releaseNetwork(nr, log); verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(false)); verify(mDcTracker, times(1)).setEnabled(eq(ApnSetting.TYPE_DEFAULT), eq(false)); } @Test Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java +12 −12 File changed.Preview size limit exceeded, changes collapsed. Show changes