Loading src/java/com/android/internal/telephony/GsmCdmaPhone.java +1 −1 Original line number Diff line number Diff line Loading @@ -317,7 +317,7 @@ public class GsmCdmaPhone extends Phone { .makeCarrierSignalAgent(this); mAccessNetworksManager = mTelephonyComponentFactory .inject(AccessNetworksManager.class.getName()) .makeAccessNetworksManager(this); .makeAccessNetworksManager(this, getLooper()); if (!isUsingNewDataStack()) { mTransportManager = mTelephonyComponentFactory.inject(TransportManager.class.getName()) .makeTransportManager(this); Loading src/java/com/android/internal/telephony/TelephonyComponentFactory.java +3 −2 Original line number Diff line number Diff line Loading @@ -412,10 +412,11 @@ public class TelephonyComponentFactory { * Make access networks manager * * @param phone The phone instance * @param looper Looper for the handler. * @return The access networks manager */ public AccessNetworksManager makeAccessNetworksManager(Phone phone) { return new AccessNetworksManager(phone); public AccessNetworksManager makeAccessNetworksManager(Phone phone, Looper looper) { return new AccessNetworksManager(phone, looper); } public CdmaSubscriptionSourceManager Loading src/java/com/android/internal/telephony/data/AccessNetworksManager.java +59 −22 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.PersistableBundle; import android.os.Registrant; import android.os.RegistrantList; Loading @@ -36,6 +37,7 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.telephony.AccessNetworkConstants; import android.telephony.AccessNetworkConstants.AccessNetworkType; import android.telephony.AccessNetworkConstants.RadioAccessNetworkType; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.Annotation.ApnType; import android.telephony.Annotation.NetCapability; Loading Loading @@ -173,6 +175,9 @@ public class AccessNetworksManager extends Handler { * transport. The preferred transports are updated as soon as QNS changes the preference, while * the current transports are updated after handover complete. */ // TODO: Deprecate mPreferredTransports. Should expose mAvailableNetworks to // DataNetworkController after we support multi preferred access networks (i.e. // DataNetworkController might select 2nd preferred access network in some scenarios.) private final Map<Integer, Integer> mPreferredTransports = new ConcurrentHashMap<>(); /** Loading Loading @@ -202,23 +207,23 @@ public class AccessNetworksManager extends Handler { public static class QualifiedNetworks { public final @ApnType int apnType; // The qualified networks in preferred order. Each network is a AccessNetworkType. public final int[] qualifiedNetworks; public QualifiedNetworks(@ApnType int apnType, int[] qualifiedNetworks) { public final @NonNull @RadioAccessNetworkType int[] qualifiedNetworks; public QualifiedNetworks(@ApnType int apnType, @NonNull int[] qualifiedNetworks) { this.apnType = apnType; this.qualifiedNetworks = qualifiedNetworks; this.qualifiedNetworks = Arrays.stream(qualifiedNetworks) .boxed() .filter(DataUtils::isValidAccessNetwork) .mapToInt(Integer::intValue) .toArray(); } @Override public String toString() { List<String> accessNetworkStrings = new ArrayList<>(); for (int network : qualifiedNetworks) { accessNetworkStrings.add(AccessNetworkType.toString(network)); } return "[QualifiedNetworks: apnType=" + ApnSetting.getApnTypeString(apnType) + ", networks=" + Arrays.stream(qualifiedNetworks) .mapToObj(type -> AccessNetworkType.toString(type)) .mapToObj(AccessNetworkType::toString) .collect(Collectors.joining(",")) + "]"; } Loading Loading @@ -322,27 +327,57 @@ public class AccessNetworksManager extends Handler { private final class QualifiedNetworksServiceCallback extends IQualifiedNetworksServiceCallback.Stub { @Override public void onQualifiedNetworkTypesChanged(int apnTypes, int[] qualifiedNetworkTypes) { log("onQualifiedNetworkTypesChanged. apnTypes = [" public void onQualifiedNetworkTypesChanged(int apnTypes, @NonNull int[] qualifiedNetworkTypes) { if (qualifiedNetworkTypes == null) { loge("onQualifiedNetworkTypesChanged: Ignored null input."); return; } log("onQualifiedNetworkTypesChanged: apnTypes = [" + ApnSetting.getApnTypesStringFromBitmask(apnTypes) + "], networks = [" + Arrays.stream(qualifiedNetworkTypes) .mapToObj(i -> AccessNetworkType.toString(i)).collect(Collectors.joining(",")) .mapToObj(AccessNetworkType::toString).collect(Collectors.joining(",")) + "]"); if (Arrays.stream(qualifiedNetworkTypes).anyMatch(accessNetwork -> !DataUtils.isValidAccessNetwork(accessNetwork))) { loge("Invalid access networks " + Arrays.toString(qualifiedNetworkTypes)); return; } List<QualifiedNetworks> qualifiedNetworksList = new ArrayList<>(); for (int supportedApnType : SUPPORTED_APN_TYPES) { if ((apnTypes & supportedApnType) == supportedApnType) { if (mAvailableNetworks.get(supportedApnType) != null) { if (Arrays.equals(mAvailableNetworks.get(supportedApnType), for (int apnType : SUPPORTED_APN_TYPES) { if ((apnTypes & apnType) == apnType) { if (mAvailableNetworks.get(apnType) != null) { if (Arrays.equals(mAvailableNetworks.get(apnType), qualifiedNetworkTypes)) { log("Available networks for " + ApnSetting.getApnTypesStringFromBitmask(supportedApnType) + ApnSetting.getApnTypesStringFromBitmask(apnType) + " not changed."); continue; } } mAvailableNetworks.put(supportedApnType, qualifiedNetworkTypes); qualifiedNetworksList.add(new QualifiedNetworks(supportedApnType, // Empty array indicates QNS did not suggest any qualified networks. In this // case all network requests will be routed to cellular. if (qualifiedNetworkTypes.length == 0) { mAvailableNetworks.remove(apnType); if (getPreferredTransport(apnType) == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { mPreferredTransports.put(apnType, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); mAccessNetworksManagerCallbacks.forEach(callback -> callback.invokeFromExecutor(() -> callback.onPreferredTransportChanged(DataUtils .apnTypeToNetworkCapability(apnType)))); } } else { mAvailableNetworks.put(apnType, qualifiedNetworkTypes); qualifiedNetworksList.add(new QualifiedNetworks(apnType, qualifiedNetworkTypes)); } } } Loading Loading @@ -377,9 +412,11 @@ public class AccessNetworksManager extends Handler { /** * Constructor * * @param phone The phone object * @param phone The phone object. * @param looper Looper for the handler. */ public AccessNetworksManager(Phone phone) { public AccessNetworksManager(@NonNull Phone phone, @NonNull Looper looper) { super(looper); mPhone = phone; mCarrierConfigManager = (CarrierConfigManager) phone.getContext().getSystemService( Context.CARRIER_CONFIG_SERVICE); Loading Loading @@ -657,11 +694,11 @@ public class AccessNetworksManager extends Handler { if (networks.qualifiedNetworks.length > 0) { int transport = getTransportFromAccessNetwork(networks.qualifiedNetworks[0]); if (getPreferredTransport(networks.apnType) != transport) { mPreferredTransports.put(networks.apnType, transport); mAccessNetworksManagerCallbacks.forEach(callback -> callback.invokeFromExecutor(() -> callback.onPreferredTransportChanged(DataUtils .apnTypeToNetworkCapability(networks.apnType)))); mPreferredTransports.put(networks.apnType, transport); logl("setPreferredTransports: apnType=" + ApnSetting.getApnTypeString(networks.apnType) + ", transport=" + AccessNetworkConstants.transportTypeToString(transport)); Loading src/java/com/android/internal/telephony/data/DataUtils.java +28 −7 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.net.NetworkAgent; import android.net.NetworkCapabilities; import android.os.SystemClock; import android.telephony.AccessNetworkConstants; import android.telephony.AccessNetworkConstants.AccessNetworkType; import android.telephony.AccessNetworkConstants.RadioAccessNetworkType; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.Annotation.NetCapability; Loading Loading @@ -305,30 +306,30 @@ public class DataUtils { case TelephonyManager.NETWORK_TYPE_GPRS: case TelephonyManager.NETWORK_TYPE_EDGE: case TelephonyManager.NETWORK_TYPE_GSM: return AccessNetworkConstants.AccessNetworkType.GERAN; return AccessNetworkType.GERAN; case TelephonyManager.NETWORK_TYPE_UMTS: case TelephonyManager.NETWORK_TYPE_HSDPA: case TelephonyManager.NETWORK_TYPE_HSPAP: case TelephonyManager.NETWORK_TYPE_HSUPA: case TelephonyManager.NETWORK_TYPE_HSPA: case TelephonyManager.NETWORK_TYPE_TD_SCDMA: return AccessNetworkConstants.AccessNetworkType.UTRAN; return AccessNetworkType.UTRAN; case TelephonyManager.NETWORK_TYPE_CDMA: case TelephonyManager.NETWORK_TYPE_EVDO_0: case TelephonyManager.NETWORK_TYPE_EVDO_A: case TelephonyManager.NETWORK_TYPE_EVDO_B: case TelephonyManager.NETWORK_TYPE_1xRTT: case TelephonyManager.NETWORK_TYPE_EHRPD: return AccessNetworkConstants.AccessNetworkType.CDMA2000; return AccessNetworkType.CDMA2000; case TelephonyManager.NETWORK_TYPE_LTE: case TelephonyManager.NETWORK_TYPE_LTE_CA: return AccessNetworkConstants.AccessNetworkType.EUTRAN; return AccessNetworkType.EUTRAN; case TelephonyManager.NETWORK_TYPE_IWLAN: return AccessNetworkConstants.AccessNetworkType.IWLAN; return AccessNetworkType.IWLAN; case TelephonyManager.NETWORK_TYPE_NR: return AccessNetworkConstants.AccessNetworkType.NGRAN; return AccessNetworkType.NGRAN; default: return AccessNetworkConstants.AccessNetworkType.UNKNOWN; return AccessNetworkType.UNKNOWN; } } Loading Loading @@ -451,4 +452,24 @@ public class DataUtils { default: return "UNKNOWN(" + linkStatus + ")"; } } /** * Check if access network type is valid. * * @param accessNetworkType The access network type to check. * @return {@code true} if the access network type is valid. */ public static boolean isValidAccessNetwork(@RadioAccessNetworkType int accessNetworkType) { switch (accessNetworkType) { case AccessNetworkType.GERAN: case AccessNetworkType.UTRAN: case AccessNetworkType.EUTRAN: case AccessNetworkType.CDMA2000: case AccessNetworkType.IWLAN: case AccessNetworkType.NGRAN: return true; default: return false; } } } tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -589,7 +589,7 @@ public abstract class TelephonyTest { doReturn(mDeviceStateMonitor).when(mTelephonyComponentFactory) .makeDeviceStateMonitor(nullable(Phone.class)); doReturn(mAccessNetworksManager).when(mTelephonyComponentFactory) .makeAccessNetworksManager(nullable(Phone.class)); .makeAccessNetworksManager(nullable(Phone.class), any(Looper.class)); doReturn(mNitzStateMachine).when(mTelephonyComponentFactory) .makeNitzStateMachine(nullable(GsmCdmaPhone.class)); doReturn(mLocaleTracker).when(mTelephonyComponentFactory) Loading Loading
src/java/com/android/internal/telephony/GsmCdmaPhone.java +1 −1 Original line number Diff line number Diff line Loading @@ -317,7 +317,7 @@ public class GsmCdmaPhone extends Phone { .makeCarrierSignalAgent(this); mAccessNetworksManager = mTelephonyComponentFactory .inject(AccessNetworksManager.class.getName()) .makeAccessNetworksManager(this); .makeAccessNetworksManager(this, getLooper()); if (!isUsingNewDataStack()) { mTransportManager = mTelephonyComponentFactory.inject(TransportManager.class.getName()) .makeTransportManager(this); Loading
src/java/com/android/internal/telephony/TelephonyComponentFactory.java +3 −2 Original line number Diff line number Diff line Loading @@ -412,10 +412,11 @@ public class TelephonyComponentFactory { * Make access networks manager * * @param phone The phone instance * @param looper Looper for the handler. * @return The access networks manager */ public AccessNetworksManager makeAccessNetworksManager(Phone phone) { return new AccessNetworksManager(phone); public AccessNetworksManager makeAccessNetworksManager(Phone phone, Looper looper) { return new AccessNetworksManager(phone, looper); } public CdmaSubscriptionSourceManager Loading
src/java/com/android/internal/telephony/data/AccessNetworksManager.java +59 −22 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.PersistableBundle; import android.os.Registrant; import android.os.RegistrantList; Loading @@ -36,6 +37,7 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.telephony.AccessNetworkConstants; import android.telephony.AccessNetworkConstants.AccessNetworkType; import android.telephony.AccessNetworkConstants.RadioAccessNetworkType; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.Annotation.ApnType; import android.telephony.Annotation.NetCapability; Loading Loading @@ -173,6 +175,9 @@ public class AccessNetworksManager extends Handler { * transport. The preferred transports are updated as soon as QNS changes the preference, while * the current transports are updated after handover complete. */ // TODO: Deprecate mPreferredTransports. Should expose mAvailableNetworks to // DataNetworkController after we support multi preferred access networks (i.e. // DataNetworkController might select 2nd preferred access network in some scenarios.) private final Map<Integer, Integer> mPreferredTransports = new ConcurrentHashMap<>(); /** Loading Loading @@ -202,23 +207,23 @@ public class AccessNetworksManager extends Handler { public static class QualifiedNetworks { public final @ApnType int apnType; // The qualified networks in preferred order. Each network is a AccessNetworkType. public final int[] qualifiedNetworks; public QualifiedNetworks(@ApnType int apnType, int[] qualifiedNetworks) { public final @NonNull @RadioAccessNetworkType int[] qualifiedNetworks; public QualifiedNetworks(@ApnType int apnType, @NonNull int[] qualifiedNetworks) { this.apnType = apnType; this.qualifiedNetworks = qualifiedNetworks; this.qualifiedNetworks = Arrays.stream(qualifiedNetworks) .boxed() .filter(DataUtils::isValidAccessNetwork) .mapToInt(Integer::intValue) .toArray(); } @Override public String toString() { List<String> accessNetworkStrings = new ArrayList<>(); for (int network : qualifiedNetworks) { accessNetworkStrings.add(AccessNetworkType.toString(network)); } return "[QualifiedNetworks: apnType=" + ApnSetting.getApnTypeString(apnType) + ", networks=" + Arrays.stream(qualifiedNetworks) .mapToObj(type -> AccessNetworkType.toString(type)) .mapToObj(AccessNetworkType::toString) .collect(Collectors.joining(",")) + "]"; } Loading Loading @@ -322,27 +327,57 @@ public class AccessNetworksManager extends Handler { private final class QualifiedNetworksServiceCallback extends IQualifiedNetworksServiceCallback.Stub { @Override public void onQualifiedNetworkTypesChanged(int apnTypes, int[] qualifiedNetworkTypes) { log("onQualifiedNetworkTypesChanged. apnTypes = [" public void onQualifiedNetworkTypesChanged(int apnTypes, @NonNull int[] qualifiedNetworkTypes) { if (qualifiedNetworkTypes == null) { loge("onQualifiedNetworkTypesChanged: Ignored null input."); return; } log("onQualifiedNetworkTypesChanged: apnTypes = [" + ApnSetting.getApnTypesStringFromBitmask(apnTypes) + "], networks = [" + Arrays.stream(qualifiedNetworkTypes) .mapToObj(i -> AccessNetworkType.toString(i)).collect(Collectors.joining(",")) .mapToObj(AccessNetworkType::toString).collect(Collectors.joining(",")) + "]"); if (Arrays.stream(qualifiedNetworkTypes).anyMatch(accessNetwork -> !DataUtils.isValidAccessNetwork(accessNetwork))) { loge("Invalid access networks " + Arrays.toString(qualifiedNetworkTypes)); return; } List<QualifiedNetworks> qualifiedNetworksList = new ArrayList<>(); for (int supportedApnType : SUPPORTED_APN_TYPES) { if ((apnTypes & supportedApnType) == supportedApnType) { if (mAvailableNetworks.get(supportedApnType) != null) { if (Arrays.equals(mAvailableNetworks.get(supportedApnType), for (int apnType : SUPPORTED_APN_TYPES) { if ((apnTypes & apnType) == apnType) { if (mAvailableNetworks.get(apnType) != null) { if (Arrays.equals(mAvailableNetworks.get(apnType), qualifiedNetworkTypes)) { log("Available networks for " + ApnSetting.getApnTypesStringFromBitmask(supportedApnType) + ApnSetting.getApnTypesStringFromBitmask(apnType) + " not changed."); continue; } } mAvailableNetworks.put(supportedApnType, qualifiedNetworkTypes); qualifiedNetworksList.add(new QualifiedNetworks(supportedApnType, // Empty array indicates QNS did not suggest any qualified networks. In this // case all network requests will be routed to cellular. if (qualifiedNetworkTypes.length == 0) { mAvailableNetworks.remove(apnType); if (getPreferredTransport(apnType) == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { mPreferredTransports.put(apnType, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); mAccessNetworksManagerCallbacks.forEach(callback -> callback.invokeFromExecutor(() -> callback.onPreferredTransportChanged(DataUtils .apnTypeToNetworkCapability(apnType)))); } } else { mAvailableNetworks.put(apnType, qualifiedNetworkTypes); qualifiedNetworksList.add(new QualifiedNetworks(apnType, qualifiedNetworkTypes)); } } } Loading Loading @@ -377,9 +412,11 @@ public class AccessNetworksManager extends Handler { /** * Constructor * * @param phone The phone object * @param phone The phone object. * @param looper Looper for the handler. */ public AccessNetworksManager(Phone phone) { public AccessNetworksManager(@NonNull Phone phone, @NonNull Looper looper) { super(looper); mPhone = phone; mCarrierConfigManager = (CarrierConfigManager) phone.getContext().getSystemService( Context.CARRIER_CONFIG_SERVICE); Loading Loading @@ -657,11 +694,11 @@ public class AccessNetworksManager extends Handler { if (networks.qualifiedNetworks.length > 0) { int transport = getTransportFromAccessNetwork(networks.qualifiedNetworks[0]); if (getPreferredTransport(networks.apnType) != transport) { mPreferredTransports.put(networks.apnType, transport); mAccessNetworksManagerCallbacks.forEach(callback -> callback.invokeFromExecutor(() -> callback.onPreferredTransportChanged(DataUtils .apnTypeToNetworkCapability(networks.apnType)))); mPreferredTransports.put(networks.apnType, transport); logl("setPreferredTransports: apnType=" + ApnSetting.getApnTypeString(networks.apnType) + ", transport=" + AccessNetworkConstants.transportTypeToString(transport)); Loading
src/java/com/android/internal/telephony/data/DataUtils.java +28 −7 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.net.NetworkAgent; import android.net.NetworkCapabilities; import android.os.SystemClock; import android.telephony.AccessNetworkConstants; import android.telephony.AccessNetworkConstants.AccessNetworkType; import android.telephony.AccessNetworkConstants.RadioAccessNetworkType; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.Annotation.NetCapability; Loading Loading @@ -305,30 +306,30 @@ public class DataUtils { case TelephonyManager.NETWORK_TYPE_GPRS: case TelephonyManager.NETWORK_TYPE_EDGE: case TelephonyManager.NETWORK_TYPE_GSM: return AccessNetworkConstants.AccessNetworkType.GERAN; return AccessNetworkType.GERAN; case TelephonyManager.NETWORK_TYPE_UMTS: case TelephonyManager.NETWORK_TYPE_HSDPA: case TelephonyManager.NETWORK_TYPE_HSPAP: case TelephonyManager.NETWORK_TYPE_HSUPA: case TelephonyManager.NETWORK_TYPE_HSPA: case TelephonyManager.NETWORK_TYPE_TD_SCDMA: return AccessNetworkConstants.AccessNetworkType.UTRAN; return AccessNetworkType.UTRAN; case TelephonyManager.NETWORK_TYPE_CDMA: case TelephonyManager.NETWORK_TYPE_EVDO_0: case TelephonyManager.NETWORK_TYPE_EVDO_A: case TelephonyManager.NETWORK_TYPE_EVDO_B: case TelephonyManager.NETWORK_TYPE_1xRTT: case TelephonyManager.NETWORK_TYPE_EHRPD: return AccessNetworkConstants.AccessNetworkType.CDMA2000; return AccessNetworkType.CDMA2000; case TelephonyManager.NETWORK_TYPE_LTE: case TelephonyManager.NETWORK_TYPE_LTE_CA: return AccessNetworkConstants.AccessNetworkType.EUTRAN; return AccessNetworkType.EUTRAN; case TelephonyManager.NETWORK_TYPE_IWLAN: return AccessNetworkConstants.AccessNetworkType.IWLAN; return AccessNetworkType.IWLAN; case TelephonyManager.NETWORK_TYPE_NR: return AccessNetworkConstants.AccessNetworkType.NGRAN; return AccessNetworkType.NGRAN; default: return AccessNetworkConstants.AccessNetworkType.UNKNOWN; return AccessNetworkType.UNKNOWN; } } Loading Loading @@ -451,4 +452,24 @@ public class DataUtils { default: return "UNKNOWN(" + linkStatus + ")"; } } /** * Check if access network type is valid. * * @param accessNetworkType The access network type to check. * @return {@code true} if the access network type is valid. */ public static boolean isValidAccessNetwork(@RadioAccessNetworkType int accessNetworkType) { switch (accessNetworkType) { case AccessNetworkType.GERAN: case AccessNetworkType.UTRAN: case AccessNetworkType.EUTRAN: case AccessNetworkType.CDMA2000: case AccessNetworkType.IWLAN: case AccessNetworkType.NGRAN: return true; default: return false; } } }
tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -589,7 +589,7 @@ public abstract class TelephonyTest { doReturn(mDeviceStateMonitor).when(mTelephonyComponentFactory) .makeDeviceStateMonitor(nullable(Phone.class)); doReturn(mAccessNetworksManager).when(mTelephonyComponentFactory) .makeAccessNetworksManager(nullable(Phone.class)); .makeAccessNetworksManager(nullable(Phone.class), any(Looper.class)); doReturn(mNitzStateMachine).when(mTelephonyComponentFactory) .makeNitzStateMachine(nullable(GsmCdmaPhone.class)); doReturn(mLocaleTracker).when(mTelephonyComponentFactory) Loading