Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +84 −9 Original line number Diff line number Diff line Loading @@ -1854,7 +1854,7 @@ public class ServiceStateTracker extends Handler { return simAbsent; } private int[] getBandwidthsFromConfigs(List<PhysicalChannelConfig> list) { private static int[] getBandwidthsFromConfigs(List<PhysicalChannelConfig> list) { return list.stream() .map(PhysicalChannelConfig::getCellBandwidthDownlinkKhz) .mapToInt(Integer::intValue) Loading Loading @@ -2529,6 +2529,28 @@ public class ServiceStateTracker extends Handler { } } private static boolean isValidNrBandwidthKhz(int bandwidth) { // Valid bandwidths, see 3gpp 38.101 sec 5.3 switch (bandwidth) { case 5000: case 10000: case 15000: case 20000: case 25000: case 30000: case 40000: case 50000: case 60000: case 70000: case 80000: case 90000: case 100000: return true; default: return false; } } /** * Extract the CID/CI for GSM/UTRA/EUTRA * Loading Loading @@ -2566,13 +2588,14 @@ public class ServiceStateTracker extends Handler { if (VDBG) { log("Setting channel number: " + cellIdentity.getChannelNumber()); } if (cellIdentity instanceof CellIdentityLte) { CellIdentityLte cl = (CellIdentityLte) cellIdentity; int[] bandwidths = null; PhysicalChannelConfig primaryPcc = getPrimaryPhysicalChannelConfigForCell( mLastPhysicalChannelConfigList, cellIdentity); if (cellIdentity instanceof CellIdentityLte) { CellIdentityLte ci = (CellIdentityLte) cellIdentity; // Prioritize the PhysicalChannelConfig list because we might already be in carrier // aggregation by the time poll state is performed. if (!ArrayUtils.isEmpty(mLastPhysicalChannelConfigList)) { if (primaryPcc != null) { bandwidths = getBandwidthsFromConfigs(mLastPhysicalChannelConfigList); for (int bw : bandwidths) { if (!isValidLteBandwidthKhz(bw)) { Loading @@ -2581,6 +2604,8 @@ public class ServiceStateTracker extends Handler { break; } } } else { if (VDBG) log("No primary LTE PhysicalChannelConfig"); } // If we don't have a PhysicalChannelConfig[] list, then pull from CellIdentityLte. // This is normal if we're in idle mode and the PhysicalChannelConfig[] has already Loading @@ -2593,7 +2618,7 @@ public class ServiceStateTracker extends Handler { // channel active). In the normal case of single-carrier non-return-to-idle, the // values *must* be the same, so it doesn't matter which is chosen. if (bandwidths == null || bandwidths.length == 1) { final int cbw = cl.getBandwidth(); final int cbw = ci.getBandwidth(); if (isValidLteBandwidthKhz(cbw)) { bandwidths = new int[] {cbw}; } else if (cbw == Integer.MAX_VALUE) { Loading @@ -2603,12 +2628,62 @@ public class ServiceStateTracker extends Handler { loge("Invalid LTE Bandwidth in RegistrationState, " + cbw); } } } else if (cellIdentity instanceof CellIdentityNr) { // Prioritize the PhysicalChannelConfig list because we might already be in carrier // aggregation by the time poll state is performed. if (primaryPcc != null) { bandwidths = getBandwidthsFromConfigs(mLastPhysicalChannelConfigList); for (int bw : bandwidths) { if (!isValidNrBandwidthKhz(bw)) { loge("Invalid NR Bandwidth in RegistrationState, " + bw); bandwidths = null; break; } } } else { if (VDBG) log("No primary NR PhysicalChannelConfig"); } // TODO: update bandwidths from CellIdentityNr if the field is added } else { if (VDBG) log("Skipping bandwidth update for Non-LTE and Non-NR cell."); } if (bandwidths == null && primaryPcc != null && primaryPcc.getCellBandwidthDownlinkKhz() != PhysicalChannelConfig.CELL_BANDWIDTH_UNKNOWN) { bandwidths = new int[] {primaryPcc.getCellBandwidthDownlinkKhz()}; } else if (VDBG) { log("Skipping bandwidth update because no primary PhysicalChannelConfig exists."); } if (bandwidths != null) { ss.setCellBandwidths(bandwidths); } } private static PhysicalChannelConfig getPrimaryPhysicalChannelConfigForCell( List<PhysicalChannelConfig> pccs, CellIdentity cellIdentity) { if (ArrayUtils.isEmpty(pccs) || !(cellIdentity instanceof CellIdentityLte || cellIdentity instanceof CellIdentityNr)) { return null; } int networkType, pci; if (cellIdentity instanceof CellIdentityLte) { networkType = TelephonyManager.NETWORK_TYPE_LTE; pci = ((CellIdentityLte) cellIdentity).getPci(); } else { if (VDBG) log("Skipping bandwidth update for Non-LTE cell."); networkType = TelephonyManager.NETWORK_TYPE_NR; pci = ((CellIdentityNr) cellIdentity).getPci(); } for (PhysicalChannelConfig pcc : pccs) { if (pcc.getConnectionStatus() == PhysicalChannelConfig.CONNECTION_PRIMARY_SERVING && pcc.getNetworkType() == networkType && pcc.getPhysicalCellId() == pci) { return pcc; } } return null; } /** Loading tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +43 −5 Original line number Diff line number Diff line Loading @@ -2094,13 +2094,15 @@ public class ServiceStateTrackerTest extends TelephonyTest { } private void sendPhyChanConfigChange(int[] bandwidths) { private void sendPhyChanConfigChange(int[] bandwidths, int networkType, int pci) { ArrayList<PhysicalChannelConfig> pc = new ArrayList<>(); int ssType = PhysicalChannelConfig.CONNECTION_PRIMARY_SERVING; for (int bw : bandwidths) { pc.add(new PhysicalChannelConfig.Builder() .setCellConnectionStatus(ssType) .setCellBandwidthDownlinkKhz(bw) .setNetworkType(networkType) .setPhysicalCellId(pci) .build()); // All cells after the first are secondary serving cells. Loading Loading @@ -2136,6 +2138,31 @@ public class ServiceStateTrackerTest extends TelephonyTest { waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); } private void sendRegStateUpdateForNrCellId(CellIdentityNr cellId) { LteVopsSupportInfo lteVopsSupportInfo = new LteVopsSupportInfo(LteVopsSupportInfo.LTE_STATUS_NOT_AVAILABLE, LteVopsSupportInfo.LTE_STATUS_NOT_AVAILABLE); NetworkRegistrationInfo dataResult = new NetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN, NetworkRegistrationInfo.REGISTRATION_STATE_HOME, TelephonyManager.NETWORK_TYPE_NR, 0, false, null, cellId, getPlmnFromCellIdentity(cellId), 1, false, false, false, lteVopsSupportInfo); NetworkRegistrationInfo voiceResult = new NetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN, NetworkRegistrationInfo.REGISTRATION_STATE_HOME, TelephonyManager.NETWORK_TYPE_NR, 0, false, null, cellId, getPlmnFromCellIdentity(cellId), false, 0, 0, 0); sst.mPollingContext[0] = 2; // update data reg state to be in service sst.sendMessage(sst.obtainMessage( ServiceStateTracker.EVENT_POLL_STATE_PS_CELLULAR_REGISTRATION, new AsyncResult(sst.mPollingContext, dataResult, null))); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); sst.sendMessage(sst.obtainMessage( ServiceStateTracker.EVENT_POLL_STATE_CS_CELLULAR_REGISTRATION, new AsyncResult(sst.mPollingContext, voiceResult, null))); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); } @Test public void testPhyChanBandwidthUpdatedOnDataRegState() throws Exception { // Cell ID change should trigger hasLocationChanged. Loading @@ -2143,7 +2170,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { new CellIdentityLte(1, 1, 5, 1, new int[] {1, 2}, 5000, "001", "01", "test", "tst", Collections.emptyList(), null); sendPhyChanConfigChange(new int[] {10000}); sendPhyChanConfigChange(new int[] {10000}, TelephonyManager.NETWORK_TYPE_LTE, 1); sendRegStateUpdateForLteCellId(cellIdentity5); assertTrue(Arrays.equals(new int[] {5000}, sst.mSS.getCellBandwidths())); } Loading @@ -2155,7 +2182,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { new CellIdentityLte(1, 1, 5, 1, new int[] {1, 2}, 12345, "001", "01", "test", "tst", Collections.emptyList(), null); sendPhyChanConfigChange(new int[] {10000}); sendPhyChanConfigChange(new int[] {10000}, TelephonyManager.NETWORK_TYPE_LTE, 1); sendRegStateUpdateForLteCellId(cellIdentityInv); assertTrue(Arrays.equals(new int[] {10000}, sst.mSS.getCellBandwidths())); } Loading @@ -2167,7 +2194,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { new CellIdentityLte(1, 1, 5, 1, new int[] {1, 2}, 10000, "001", "01", "test", "tst", Collections.emptyList(), null); sendPhyChanConfigChange(new int[] {10000, 5000}); sendPhyChanConfigChange(new int[] {10000, 5000}, TelephonyManager.NETWORK_TYPE_LTE, 1); sendRegStateUpdateForLteCellId(cellIdentity10); assertTrue(Arrays.equals(new int[] {10000, 5000}, sst.mSS.getCellBandwidths())); } Loading @@ -2181,7 +2208,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { sendRegStateUpdateForLteCellId(cellIdentity10); assertTrue(Arrays.equals(new int[] {10000}, sst.mSS.getCellBandwidths())); sendPhyChanConfigChange(new int[] {10000, 5000}); sendPhyChanConfigChange(new int[] {10000, 5000}, TelephonyManager.NETWORK_TYPE_LTE, 1); assertTrue(Arrays.equals(new int[] {10000, 5000}, sst.mSS.getCellBandwidths())); } Loading Loading @@ -2212,6 +2239,17 @@ public class ServiceStateTrackerTest extends TelephonyTest { assertTrue(Arrays.equals(new int[0], sst.mSS.getCellBandwidths())); } @Test public void testPhyChanBandwidthForNr() { // NR Cell with bandwidth = 10000 CellIdentityNr nrCi = new CellIdentityNr( 0, 0, 0, new int[] {}, "", "", 5, "", "", Collections.emptyList()); sendPhyChanConfigChange(new int[] {10000, 5000}, TelephonyManager.NETWORK_TYPE_NR, 0); sendRegStateUpdateForNrCellId(nrCi); assertTrue(Arrays.equals(new int[] {10000, 5000}, sst.mSS.getCellBandwidths())); } /** * Ensure that TransportManager changes due to transport preference changes are picked up in the * new ServiceState when a poll event occurs. This causes ServiceState#getRilDataRadioTechnology Loading Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +84 −9 Original line number Diff line number Diff line Loading @@ -1854,7 +1854,7 @@ public class ServiceStateTracker extends Handler { return simAbsent; } private int[] getBandwidthsFromConfigs(List<PhysicalChannelConfig> list) { private static int[] getBandwidthsFromConfigs(List<PhysicalChannelConfig> list) { return list.stream() .map(PhysicalChannelConfig::getCellBandwidthDownlinkKhz) .mapToInt(Integer::intValue) Loading Loading @@ -2529,6 +2529,28 @@ public class ServiceStateTracker extends Handler { } } private static boolean isValidNrBandwidthKhz(int bandwidth) { // Valid bandwidths, see 3gpp 38.101 sec 5.3 switch (bandwidth) { case 5000: case 10000: case 15000: case 20000: case 25000: case 30000: case 40000: case 50000: case 60000: case 70000: case 80000: case 90000: case 100000: return true; default: return false; } } /** * Extract the CID/CI for GSM/UTRA/EUTRA * Loading Loading @@ -2566,13 +2588,14 @@ public class ServiceStateTracker extends Handler { if (VDBG) { log("Setting channel number: " + cellIdentity.getChannelNumber()); } if (cellIdentity instanceof CellIdentityLte) { CellIdentityLte cl = (CellIdentityLte) cellIdentity; int[] bandwidths = null; PhysicalChannelConfig primaryPcc = getPrimaryPhysicalChannelConfigForCell( mLastPhysicalChannelConfigList, cellIdentity); if (cellIdentity instanceof CellIdentityLte) { CellIdentityLte ci = (CellIdentityLte) cellIdentity; // Prioritize the PhysicalChannelConfig list because we might already be in carrier // aggregation by the time poll state is performed. if (!ArrayUtils.isEmpty(mLastPhysicalChannelConfigList)) { if (primaryPcc != null) { bandwidths = getBandwidthsFromConfigs(mLastPhysicalChannelConfigList); for (int bw : bandwidths) { if (!isValidLteBandwidthKhz(bw)) { Loading @@ -2581,6 +2604,8 @@ public class ServiceStateTracker extends Handler { break; } } } else { if (VDBG) log("No primary LTE PhysicalChannelConfig"); } // If we don't have a PhysicalChannelConfig[] list, then pull from CellIdentityLte. // This is normal if we're in idle mode and the PhysicalChannelConfig[] has already Loading @@ -2593,7 +2618,7 @@ public class ServiceStateTracker extends Handler { // channel active). In the normal case of single-carrier non-return-to-idle, the // values *must* be the same, so it doesn't matter which is chosen. if (bandwidths == null || bandwidths.length == 1) { final int cbw = cl.getBandwidth(); final int cbw = ci.getBandwidth(); if (isValidLteBandwidthKhz(cbw)) { bandwidths = new int[] {cbw}; } else if (cbw == Integer.MAX_VALUE) { Loading @@ -2603,12 +2628,62 @@ public class ServiceStateTracker extends Handler { loge("Invalid LTE Bandwidth in RegistrationState, " + cbw); } } } else if (cellIdentity instanceof CellIdentityNr) { // Prioritize the PhysicalChannelConfig list because we might already be in carrier // aggregation by the time poll state is performed. if (primaryPcc != null) { bandwidths = getBandwidthsFromConfigs(mLastPhysicalChannelConfigList); for (int bw : bandwidths) { if (!isValidNrBandwidthKhz(bw)) { loge("Invalid NR Bandwidth in RegistrationState, " + bw); bandwidths = null; break; } } } else { if (VDBG) log("No primary NR PhysicalChannelConfig"); } // TODO: update bandwidths from CellIdentityNr if the field is added } else { if (VDBG) log("Skipping bandwidth update for Non-LTE and Non-NR cell."); } if (bandwidths == null && primaryPcc != null && primaryPcc.getCellBandwidthDownlinkKhz() != PhysicalChannelConfig.CELL_BANDWIDTH_UNKNOWN) { bandwidths = new int[] {primaryPcc.getCellBandwidthDownlinkKhz()}; } else if (VDBG) { log("Skipping bandwidth update because no primary PhysicalChannelConfig exists."); } if (bandwidths != null) { ss.setCellBandwidths(bandwidths); } } private static PhysicalChannelConfig getPrimaryPhysicalChannelConfigForCell( List<PhysicalChannelConfig> pccs, CellIdentity cellIdentity) { if (ArrayUtils.isEmpty(pccs) || !(cellIdentity instanceof CellIdentityLte || cellIdentity instanceof CellIdentityNr)) { return null; } int networkType, pci; if (cellIdentity instanceof CellIdentityLte) { networkType = TelephonyManager.NETWORK_TYPE_LTE; pci = ((CellIdentityLte) cellIdentity).getPci(); } else { if (VDBG) log("Skipping bandwidth update for Non-LTE cell."); networkType = TelephonyManager.NETWORK_TYPE_NR; pci = ((CellIdentityNr) cellIdentity).getPci(); } for (PhysicalChannelConfig pcc : pccs) { if (pcc.getConnectionStatus() == PhysicalChannelConfig.CONNECTION_PRIMARY_SERVING && pcc.getNetworkType() == networkType && pcc.getPhysicalCellId() == pci) { return pcc; } } return null; } /** Loading
tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +43 −5 Original line number Diff line number Diff line Loading @@ -2094,13 +2094,15 @@ public class ServiceStateTrackerTest extends TelephonyTest { } private void sendPhyChanConfigChange(int[] bandwidths) { private void sendPhyChanConfigChange(int[] bandwidths, int networkType, int pci) { ArrayList<PhysicalChannelConfig> pc = new ArrayList<>(); int ssType = PhysicalChannelConfig.CONNECTION_PRIMARY_SERVING; for (int bw : bandwidths) { pc.add(new PhysicalChannelConfig.Builder() .setCellConnectionStatus(ssType) .setCellBandwidthDownlinkKhz(bw) .setNetworkType(networkType) .setPhysicalCellId(pci) .build()); // All cells after the first are secondary serving cells. Loading Loading @@ -2136,6 +2138,31 @@ public class ServiceStateTrackerTest extends TelephonyTest { waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); } private void sendRegStateUpdateForNrCellId(CellIdentityNr cellId) { LteVopsSupportInfo lteVopsSupportInfo = new LteVopsSupportInfo(LteVopsSupportInfo.LTE_STATUS_NOT_AVAILABLE, LteVopsSupportInfo.LTE_STATUS_NOT_AVAILABLE); NetworkRegistrationInfo dataResult = new NetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN, NetworkRegistrationInfo.REGISTRATION_STATE_HOME, TelephonyManager.NETWORK_TYPE_NR, 0, false, null, cellId, getPlmnFromCellIdentity(cellId), 1, false, false, false, lteVopsSupportInfo); NetworkRegistrationInfo voiceResult = new NetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN, NetworkRegistrationInfo.REGISTRATION_STATE_HOME, TelephonyManager.NETWORK_TYPE_NR, 0, false, null, cellId, getPlmnFromCellIdentity(cellId), false, 0, 0, 0); sst.mPollingContext[0] = 2; // update data reg state to be in service sst.sendMessage(sst.obtainMessage( ServiceStateTracker.EVENT_POLL_STATE_PS_CELLULAR_REGISTRATION, new AsyncResult(sst.mPollingContext, dataResult, null))); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); sst.sendMessage(sst.obtainMessage( ServiceStateTracker.EVENT_POLL_STATE_CS_CELLULAR_REGISTRATION, new AsyncResult(sst.mPollingContext, voiceResult, null))); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); } @Test public void testPhyChanBandwidthUpdatedOnDataRegState() throws Exception { // Cell ID change should trigger hasLocationChanged. Loading @@ -2143,7 +2170,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { new CellIdentityLte(1, 1, 5, 1, new int[] {1, 2}, 5000, "001", "01", "test", "tst", Collections.emptyList(), null); sendPhyChanConfigChange(new int[] {10000}); sendPhyChanConfigChange(new int[] {10000}, TelephonyManager.NETWORK_TYPE_LTE, 1); sendRegStateUpdateForLteCellId(cellIdentity5); assertTrue(Arrays.equals(new int[] {5000}, sst.mSS.getCellBandwidths())); } Loading @@ -2155,7 +2182,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { new CellIdentityLte(1, 1, 5, 1, new int[] {1, 2}, 12345, "001", "01", "test", "tst", Collections.emptyList(), null); sendPhyChanConfigChange(new int[] {10000}); sendPhyChanConfigChange(new int[] {10000}, TelephonyManager.NETWORK_TYPE_LTE, 1); sendRegStateUpdateForLteCellId(cellIdentityInv); assertTrue(Arrays.equals(new int[] {10000}, sst.mSS.getCellBandwidths())); } Loading @@ -2167,7 +2194,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { new CellIdentityLte(1, 1, 5, 1, new int[] {1, 2}, 10000, "001", "01", "test", "tst", Collections.emptyList(), null); sendPhyChanConfigChange(new int[] {10000, 5000}); sendPhyChanConfigChange(new int[] {10000, 5000}, TelephonyManager.NETWORK_TYPE_LTE, 1); sendRegStateUpdateForLteCellId(cellIdentity10); assertTrue(Arrays.equals(new int[] {10000, 5000}, sst.mSS.getCellBandwidths())); } Loading @@ -2181,7 +2208,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { sendRegStateUpdateForLteCellId(cellIdentity10); assertTrue(Arrays.equals(new int[] {10000}, sst.mSS.getCellBandwidths())); sendPhyChanConfigChange(new int[] {10000, 5000}); sendPhyChanConfigChange(new int[] {10000, 5000}, TelephonyManager.NETWORK_TYPE_LTE, 1); assertTrue(Arrays.equals(new int[] {10000, 5000}, sst.mSS.getCellBandwidths())); } Loading Loading @@ -2212,6 +2239,17 @@ public class ServiceStateTrackerTest extends TelephonyTest { assertTrue(Arrays.equals(new int[0], sst.mSS.getCellBandwidths())); } @Test public void testPhyChanBandwidthForNr() { // NR Cell with bandwidth = 10000 CellIdentityNr nrCi = new CellIdentityNr( 0, 0, 0, new int[] {}, "", "", 5, "", "", Collections.emptyList()); sendPhyChanConfigChange(new int[] {10000, 5000}, TelephonyManager.NETWORK_TYPE_NR, 0); sendRegStateUpdateForNrCellId(nrCi); assertTrue(Arrays.equals(new int[] {10000, 5000}, sst.mSS.getCellBandwidths())); } /** * Ensure that TransportManager changes due to transport preference changes are picked up in the * new ServiceState when a poll event occurs. This causes ServiceState#getRilDataRadioTechnology Loading