Loading src/java/com/android/internal/telephony/satellite/SatelliteController.java +112 −8 Original line number Diff line number Diff line Loading @@ -6086,6 +6086,57 @@ public class SatelliteController extends Handler { } } @NonNull private int getMaxAllowedDataModeDeviceConfigOverlay() { int maxAllowedDataMode = CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED; try { maxAllowedDataMode = mContext.getResources().getInteger(R.integer.max_allowed_data_mode); } catch (Resources.NotFoundException ex) { ploge( "getMaxAllowedDataModeDeviceConfigOverlay: max_allowed_data_mode resource not" + " found. ex=" + ex); } logd("getMaxAllowedDataModeDeviceConfigOverlay: " + maxAllowedDataMode); return maxAllowedDataMode; } /** * @return An integer representing the maximum allowed data mode. This will be the value from * the configupdater configuration if available and valid, otherwise the value from the * device configuration overlay. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public int getMaxAllowedDataMode() { int maxAllowedDataMode = getMaxAllowedDataModeDeviceConfigOverlay(); logd("getMaxAllowedDataMode: device config=" + maxAllowedDataMode); SatelliteConfig satelliteConfig = getSatelliteConfig(); if (satelliteConfig == null) { logd( "getMaxAllowedDataMode: satelliteConfig is null: " + "return " + maxAllowedDataMode); return maxAllowedDataMode; } if (satelliteConfig.getSatelliteMaxAllowedDataMode() == null) { logd( "getMaxAllowedDataMode: getSatelliteMaxAllowedDataMode() is null: " + "return " + maxAllowedDataMode); return maxAllowedDataMode; } maxAllowedDataMode = satelliteConfig.getSatelliteMaxAllowedDataMode(); logd( "getMaxAllowedDataMode: " + "satelliteConfig.getSatelliteMaxAllowedDataMode()=" + maxAllowedDataMode); return maxAllowedDataMode; } @NonNull private List<String> readSatellitePlmnsFromOverlayConfig() { String[] devicePlmns = readStringArrayFromOverlayConfig( Loading Loading @@ -9741,18 +9792,30 @@ public class SatelliteController extends Handler { /** * Method to return the current satellite data service policy supported mode for the registered * plmn based on entitlement provisioning information. Note: If no information at * provisioning is supported this is overridden with operator carrier config information * if available satellite services support data else data service policy is marked as * restricted. * plmn based on entitlement provisioning information. Note: If no information at provisioning * is supported this is overridden with operator carrier config information if available * satellite services support data else data service policy is marked as restricted. Note that * the data service policy is capped at maxAllowedDataMode which is configured by OEMs through * {@link R.integer.max_allowed_data_mode} or through {@link SatelliteConfig} * * @param subId current subscription id * @param plmn current registered plmn information * * @return Supported modes {@link CarrierConfigManager.SATELLITE_DATA_SUPPORT_MODE} */ public int getSatelliteDataServicePolicyForPlmn(int subId, String plmn) { plogd("getSatelliteDataServicePolicyForPlmn: subId=" + subId + " plmn=" + plmn); int maxAllowedDataMode = getMaxAllowedDataMode(); plogd("getSatelliteDataServicePolicyForPlmn: maxAllowedDataMode=" + maxAllowedDataMode); if (maxAllowedDataMode == CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED) { plogd( "maxAllowedDataMode is " + CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED + ", the least possible value. Data service policy cannot go below" + " that. Therefore, returning this"); return maxAllowedDataMode; } if (isValidSubscriptionId(subId)) { Map<String, Integer> dataServicePolicy; synchronized (mSupportedSatelliteServicesLock) { Loading @@ -9767,6 +9830,18 @@ public class SatelliteController extends Handler { if (!TextUtils.isEmpty(plmn) && dataServicePolicy.containsKey(plmn)) { plogd("getSatelliteDataServicePolicyForPlmn: " + "return policy using dataServicePolicy map"); if (dataServicePolicy.get(plmn) > maxAllowedDataMode) { plogd( "getSatelliteDataServicePolicyForPlmn: dataServicePolicy shouldn't " + "be bigger than maxAllowedDataMode: " + maxAllowedDataMode); return maxAllowedDataMode; } plogd( "getSatelliteDataServicePolicyForPlmn: " + "return policy using dataServicePolicy map: " + dataServicePolicy.get(plmn)); return dataServicePolicy.get(plmn); } else if (TextUtils.isEmpty(plmn)) { int preferredPolicy = Loading @@ -9786,8 +9861,23 @@ public class SatelliteController extends Handler { // subscription id. if (preferredPolicy > CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED) { plogd("getSatelliteDataServicePolicyForPlmn: " + "return preferredPolicy=" + preferredPolicy); plogd( "getSatelliteDataServicePolicyForPlmn: " + "preferredPolicy=" + preferredPolicy); if (preferredPolicy > maxAllowedDataMode) { plogd( "getSatelliteDataServicePolicyForPlmn: preferredPolicy" + " shouldn't be bigger than maxAllowedDataMode: " + maxAllowedDataMode); return maxAllowedDataMode; } plogd( "getSatelliteDataServicePolicyForPlmn: " + "returning preferredPolicy=" + preferredPolicy); return preferredPolicy; } } Loading @@ -9795,7 +9885,21 @@ public class SatelliteController extends Handler { if (isSatelliteDataServicesAllowed(subId, plmn)) { plogd("getSatelliteDataServicePolicyForPlmn: return data support mode from config"); return getCarrierSatelliteDataSupportedModeFromConfig(subId); int carrierSatelliteDataSupportedMode = getCarrierSatelliteDataSupportedModeFromConfig(subId); if (carrierSatelliteDataSupportedMode > maxAllowedDataMode) { plogd( "getSatelliteDataServicePolicyForPlmn:" + " carrierSatelliteDataSupportedMode shouldn't be bigger than" + " maxAllowedDataMode: " + maxAllowedDataMode); return maxAllowedDataMode; } plogd( "getSatelliteDataServicePolicyForPlmn: return data support mode from" + " config: " + carrierSatelliteDataSupportedMode); return carrierSatelliteDataSupportedMode; } } Loading tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java +289 −0 Original line number Diff line number Diff line Loading @@ -4261,6 +4261,50 @@ public class SatelliteControllerTest extends TelephonyTest { assertTrue(mSatelliteControllerUT.isFoldable(mContext, foldableDeviceStateList)); } @Test public void testGetMaxAllowedDataMode() { logd("testGetMaxAllowedDataMode"); doReturn(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED) .when(mResources) .getInteger(eq(R.integer.max_allowed_data_mode)); // case mMockConfigParser is null doReturn(null).when(mMockConfigParser).getConfig(); assertEquals( "Check satelliteConfig is null case", SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, mSatelliteControllerUT.getMaxAllowedDataMode()); // case mMockConfig.getSatelliteMaxAllowedDataMode is null doReturn(mMockConfig).when(mMockConfigParser).getConfig(); doReturn(null).when(mMockConfig).getSatelliteMaxAllowedDataMode(); assertEquals( "Check getSatelliteMaxAllowedDataMode() is null case", SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, mSatelliteControllerUT.getMaxAllowedDataMode()); // case mMockConfig.getSatelliteMaxAllowedDataMode is bigger than device config doReturn(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED) .when(mMockConfig) .getSatelliteMaxAllowedDataMode(); assertEquals( "Check satelliteConfig value is 'bandwidth constrained' case", SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, mSatelliteControllerUT.getMaxAllowedDataMode()); // case mMockConfig.getSatelliteMaxAllowedDataMode is smaller than device config doReturn(SATELLITE_DATA_SUPPORT_ALL) .when(mResources) .getInteger(eq(R.integer.max_allowed_data_mode)); doReturn(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED) .when(mMockConfig) .getSatelliteMaxAllowedDataMode(); assertEquals( "Check satelliteConfig value should override device config", SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, mSatelliteControllerUT.getMaxAllowedDataMode()); } @Test public void testTerrestrialNetworkAvailableChangedCallback() { when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true); Loading Loading @@ -6613,6 +6657,10 @@ public class SatelliteControllerTest extends TelephonyTest { public void testGetSupportedSatelliteDataModeForPlmn_WithEntitlement() throws Exception { logd("testGetSupportedSatelliteDataModeForPlmn_WithEntitlement"); mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_ALL); doReturn(SATELLITE_DATA_SUPPORT_ALL).when(mMockConfig).getSatelliteMaxAllowedDataMode(); replaceInstance(SatelliteController.class, "mMergedPlmnListPerCarrier", mSatelliteControllerUT, new SparseArray<>()); List<String> overlayConfigPlmnList = new ArrayList<>(); Loading Loading @@ -6694,10 +6742,126 @@ public class SatelliteControllerTest extends TelephonyTest { assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); } @Test public void testGetSupportedSatelliteDataModeForPlmn_WithEntitlement_AllMaxAllowedDataMode() throws Exception { logd("testGetSupportedSatelliteDataModeForPlmn_WithEntitlement_AllMaxAllowedDataMode"); replaceInstance( SatelliteController.class, "mMergedPlmnListPerCarrier", mSatelliteControllerUT, new SparseArray<>()); List<String> overlayConfigPlmnList = new ArrayList<>(); replaceInstance( SatelliteController.class, "mSatellitePlmnListFromOverlayConfig", mSatelliteControllerUT, overlayConfigPlmnList); mCarrierConfigBundle.putBoolean( CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, true); // With Satellite entitlement support bool true with entitlement data service policy map mCarrierConfigBundle.putBoolean( CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, true); List<String> entitlementPlmnList = Arrays.stream(new String[] {"00101", "00102", "00103", "00104"}).toList(); List<String> barredPlmnList = new ArrayList<>(); Map<String, Integer> dataServicePolicyMap = Map.of( "00101", SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, "00102", SATELLITE_DATA_SUPPORT_ALL); mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated( SUB_ID, false, entitlementPlmnList, barredPlmnList, new HashMap<>(), new HashMap<>(), dataServicePolicyMap, new HashMap<>(), mIIntegerConsumer); // Cap maxAllowedDataMode to SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED); doReturn(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED) .when(mMockConfig) .getSatelliteMaxAllowedDataMode(); int dataSupportModeForPlmn; dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00102"); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); // Cap maxAllowedDataMode to SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED); doReturn(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED) .when(mMockConfig) .getSatelliteMaxAllowedDataMode(); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00102"); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); // Cap maxAllowedDataMode to SATELLITE_DATA_SUPPORT_ALL mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_ALL); doReturn(SATELLITE_DATA_SUPPORT_ALL).when(mMockConfig).getSatelliteMaxAllowedDataMode(); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00102"); assertEquals(SATELLITE_DATA_SUPPORT_ALL, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ALL, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ALL, dataSupportModeForPlmn); } @Test public void testGetSupportedSatelliteDataModeForPlmn_WithoutEntitlement() throws Exception { logd("testGetSupportedSatelliteDataModeForPlmn_WithoutEntitlement"); mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_ALL); doReturn(SATELLITE_DATA_SUPPORT_ALL).when(mMockConfig).getSatelliteMaxAllowedDataMode(); replaceInstance(SatelliteController.class, "mMergedPlmnListPerCarrier", mSatelliteControllerUT, new SparseArray<>()); List<String> overlayConfigPlmnList = new ArrayList<>(); Loading Loading @@ -6753,6 +6917,131 @@ public class SatelliteControllerTest extends TelephonyTest { .getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); } @Test public void testGetSupportedSatelliteDataModeForPlmn_WithoutEntitlement_AllMaxAllowedDataMode() throws Exception { logd("testGetSupportedSatelliteDataModeForPlmn_WithoutEntitlement_AllMaxAllowedDataMode"); replaceInstance( SatelliteController.class, "mMergedPlmnListPerCarrier", mSatelliteControllerUT, new SparseArray<>()); List<String> overlayConfigPlmnList = new ArrayList<>(); replaceInstance( SatelliteController.class, "mSatellitePlmnListFromOverlayConfig", mSatelliteControllerUT, overlayConfigPlmnList); mCarrierConfigBundle.putBoolean( CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, true); // Without entitlement mCarrierConfigBundle.putBoolean( CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, false); List<String> entitlementPlmnList = Arrays.stream(new String[] {"00101", "00102", "00103", "00104"}).toList(); List<String> barredPlmnList = new ArrayList<>(); Map<String, Integer> dataServicePolicyMap = new HashMap<>(); mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated( SUB_ID, false, entitlementPlmnList, barredPlmnList, new HashMap<>(), new HashMap<>(), dataServicePolicyMap, new HashMap<>(), mIIntegerConsumer); // when Available satellite services is not configured with data service mCarrierConfigBundle.putInt( CarrierConfigManager.KEY_SATELLITE_DATA_SUPPORT_MODE_INT, SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED); int dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); setConfigData(new ArrayList<>()); PersistableBundle carrierSupportedSatelliteServicesPerProvider = new PersistableBundle(); List<String> carrierConfigPlmnList = List.of("00101"); carrierSupportedSatelliteServicesPerProvider.putIntArray( carrierConfigPlmnList.get(0), new int[] {2, 3, 5}); mCarrierConfigBundle.putPersistableBundle( CarrierConfigManager.KEY_CARRIER_SUPPORTED_SATELLITE_SERVICES_PER_PROVIDER_BUNDLE, carrierSupportedSatelliteServicesPerProvider); invokeCarrierConfigChanged(); // when Available satellite services support data service // And maxAllowedDataMode capped to SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED); doReturn(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED) .when(mMockConfig) .getSatelliteMaxAllowedDataMode(); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); // when Available satellite services support data service // And maxAllowedDataMode capped to SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED); doReturn(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED) .when(mMockConfig) .getSatelliteMaxAllowedDataMode(); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); // when Available satellite services support data service // And maxAllowedDataMode capped to SATELLITE_DATA_SUPPORT_ALL mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_ALL); doReturn(SATELLITE_DATA_SUPPORT_ALL).when(mMockConfig).getSatelliteMaxAllowedDataMode(); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT .getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); Loading Loading
src/java/com/android/internal/telephony/satellite/SatelliteController.java +112 −8 Original line number Diff line number Diff line Loading @@ -6086,6 +6086,57 @@ public class SatelliteController extends Handler { } } @NonNull private int getMaxAllowedDataModeDeviceConfigOverlay() { int maxAllowedDataMode = CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED; try { maxAllowedDataMode = mContext.getResources().getInteger(R.integer.max_allowed_data_mode); } catch (Resources.NotFoundException ex) { ploge( "getMaxAllowedDataModeDeviceConfigOverlay: max_allowed_data_mode resource not" + " found. ex=" + ex); } logd("getMaxAllowedDataModeDeviceConfigOverlay: " + maxAllowedDataMode); return maxAllowedDataMode; } /** * @return An integer representing the maximum allowed data mode. This will be the value from * the configupdater configuration if available and valid, otherwise the value from the * device configuration overlay. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public int getMaxAllowedDataMode() { int maxAllowedDataMode = getMaxAllowedDataModeDeviceConfigOverlay(); logd("getMaxAllowedDataMode: device config=" + maxAllowedDataMode); SatelliteConfig satelliteConfig = getSatelliteConfig(); if (satelliteConfig == null) { logd( "getMaxAllowedDataMode: satelliteConfig is null: " + "return " + maxAllowedDataMode); return maxAllowedDataMode; } if (satelliteConfig.getSatelliteMaxAllowedDataMode() == null) { logd( "getMaxAllowedDataMode: getSatelliteMaxAllowedDataMode() is null: " + "return " + maxAllowedDataMode); return maxAllowedDataMode; } maxAllowedDataMode = satelliteConfig.getSatelliteMaxAllowedDataMode(); logd( "getMaxAllowedDataMode: " + "satelliteConfig.getSatelliteMaxAllowedDataMode()=" + maxAllowedDataMode); return maxAllowedDataMode; } @NonNull private List<String> readSatellitePlmnsFromOverlayConfig() { String[] devicePlmns = readStringArrayFromOverlayConfig( Loading Loading @@ -9741,18 +9792,30 @@ public class SatelliteController extends Handler { /** * Method to return the current satellite data service policy supported mode for the registered * plmn based on entitlement provisioning information. Note: If no information at * provisioning is supported this is overridden with operator carrier config information * if available satellite services support data else data service policy is marked as * restricted. * plmn based on entitlement provisioning information. Note: If no information at provisioning * is supported this is overridden with operator carrier config information if available * satellite services support data else data service policy is marked as restricted. Note that * the data service policy is capped at maxAllowedDataMode which is configured by OEMs through * {@link R.integer.max_allowed_data_mode} or through {@link SatelliteConfig} * * @param subId current subscription id * @param plmn current registered plmn information * * @return Supported modes {@link CarrierConfigManager.SATELLITE_DATA_SUPPORT_MODE} */ public int getSatelliteDataServicePolicyForPlmn(int subId, String plmn) { plogd("getSatelliteDataServicePolicyForPlmn: subId=" + subId + " plmn=" + plmn); int maxAllowedDataMode = getMaxAllowedDataMode(); plogd("getSatelliteDataServicePolicyForPlmn: maxAllowedDataMode=" + maxAllowedDataMode); if (maxAllowedDataMode == CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED) { plogd( "maxAllowedDataMode is " + CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED + ", the least possible value. Data service policy cannot go below" + " that. Therefore, returning this"); return maxAllowedDataMode; } if (isValidSubscriptionId(subId)) { Map<String, Integer> dataServicePolicy; synchronized (mSupportedSatelliteServicesLock) { Loading @@ -9767,6 +9830,18 @@ public class SatelliteController extends Handler { if (!TextUtils.isEmpty(plmn) && dataServicePolicy.containsKey(plmn)) { plogd("getSatelliteDataServicePolicyForPlmn: " + "return policy using dataServicePolicy map"); if (dataServicePolicy.get(plmn) > maxAllowedDataMode) { plogd( "getSatelliteDataServicePolicyForPlmn: dataServicePolicy shouldn't " + "be bigger than maxAllowedDataMode: " + maxAllowedDataMode); return maxAllowedDataMode; } plogd( "getSatelliteDataServicePolicyForPlmn: " + "return policy using dataServicePolicy map: " + dataServicePolicy.get(plmn)); return dataServicePolicy.get(plmn); } else if (TextUtils.isEmpty(plmn)) { int preferredPolicy = Loading @@ -9786,8 +9861,23 @@ public class SatelliteController extends Handler { // subscription id. if (preferredPolicy > CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED) { plogd("getSatelliteDataServicePolicyForPlmn: " + "return preferredPolicy=" + preferredPolicy); plogd( "getSatelliteDataServicePolicyForPlmn: " + "preferredPolicy=" + preferredPolicy); if (preferredPolicy > maxAllowedDataMode) { plogd( "getSatelliteDataServicePolicyForPlmn: preferredPolicy" + " shouldn't be bigger than maxAllowedDataMode: " + maxAllowedDataMode); return maxAllowedDataMode; } plogd( "getSatelliteDataServicePolicyForPlmn: " + "returning preferredPolicy=" + preferredPolicy); return preferredPolicy; } } Loading @@ -9795,7 +9885,21 @@ public class SatelliteController extends Handler { if (isSatelliteDataServicesAllowed(subId, plmn)) { plogd("getSatelliteDataServicePolicyForPlmn: return data support mode from config"); return getCarrierSatelliteDataSupportedModeFromConfig(subId); int carrierSatelliteDataSupportedMode = getCarrierSatelliteDataSupportedModeFromConfig(subId); if (carrierSatelliteDataSupportedMode > maxAllowedDataMode) { plogd( "getSatelliteDataServicePolicyForPlmn:" + " carrierSatelliteDataSupportedMode shouldn't be bigger than" + " maxAllowedDataMode: " + maxAllowedDataMode); return maxAllowedDataMode; } plogd( "getSatelliteDataServicePolicyForPlmn: return data support mode from" + " config: " + carrierSatelliteDataSupportedMode); return carrierSatelliteDataSupportedMode; } } Loading
tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java +289 −0 Original line number Diff line number Diff line Loading @@ -4261,6 +4261,50 @@ public class SatelliteControllerTest extends TelephonyTest { assertTrue(mSatelliteControllerUT.isFoldable(mContext, foldableDeviceStateList)); } @Test public void testGetMaxAllowedDataMode() { logd("testGetMaxAllowedDataMode"); doReturn(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED) .when(mResources) .getInteger(eq(R.integer.max_allowed_data_mode)); // case mMockConfigParser is null doReturn(null).when(mMockConfigParser).getConfig(); assertEquals( "Check satelliteConfig is null case", SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, mSatelliteControllerUT.getMaxAllowedDataMode()); // case mMockConfig.getSatelliteMaxAllowedDataMode is null doReturn(mMockConfig).when(mMockConfigParser).getConfig(); doReturn(null).when(mMockConfig).getSatelliteMaxAllowedDataMode(); assertEquals( "Check getSatelliteMaxAllowedDataMode() is null case", SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, mSatelliteControllerUT.getMaxAllowedDataMode()); // case mMockConfig.getSatelliteMaxAllowedDataMode is bigger than device config doReturn(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED) .when(mMockConfig) .getSatelliteMaxAllowedDataMode(); assertEquals( "Check satelliteConfig value is 'bandwidth constrained' case", SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, mSatelliteControllerUT.getMaxAllowedDataMode()); // case mMockConfig.getSatelliteMaxAllowedDataMode is smaller than device config doReturn(SATELLITE_DATA_SUPPORT_ALL) .when(mResources) .getInteger(eq(R.integer.max_allowed_data_mode)); doReturn(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED) .when(mMockConfig) .getSatelliteMaxAllowedDataMode(); assertEquals( "Check satelliteConfig value should override device config", SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, mSatelliteControllerUT.getMaxAllowedDataMode()); } @Test public void testTerrestrialNetworkAvailableChangedCallback() { when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true); Loading Loading @@ -6613,6 +6657,10 @@ public class SatelliteControllerTest extends TelephonyTest { public void testGetSupportedSatelliteDataModeForPlmn_WithEntitlement() throws Exception { logd("testGetSupportedSatelliteDataModeForPlmn_WithEntitlement"); mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_ALL); doReturn(SATELLITE_DATA_SUPPORT_ALL).when(mMockConfig).getSatelliteMaxAllowedDataMode(); replaceInstance(SatelliteController.class, "mMergedPlmnListPerCarrier", mSatelliteControllerUT, new SparseArray<>()); List<String> overlayConfigPlmnList = new ArrayList<>(); Loading Loading @@ -6694,10 +6742,126 @@ public class SatelliteControllerTest extends TelephonyTest { assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); } @Test public void testGetSupportedSatelliteDataModeForPlmn_WithEntitlement_AllMaxAllowedDataMode() throws Exception { logd("testGetSupportedSatelliteDataModeForPlmn_WithEntitlement_AllMaxAllowedDataMode"); replaceInstance( SatelliteController.class, "mMergedPlmnListPerCarrier", mSatelliteControllerUT, new SparseArray<>()); List<String> overlayConfigPlmnList = new ArrayList<>(); replaceInstance( SatelliteController.class, "mSatellitePlmnListFromOverlayConfig", mSatelliteControllerUT, overlayConfigPlmnList); mCarrierConfigBundle.putBoolean( CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, true); // With Satellite entitlement support bool true with entitlement data service policy map mCarrierConfigBundle.putBoolean( CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, true); List<String> entitlementPlmnList = Arrays.stream(new String[] {"00101", "00102", "00103", "00104"}).toList(); List<String> barredPlmnList = new ArrayList<>(); Map<String, Integer> dataServicePolicyMap = Map.of( "00101", SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, "00102", SATELLITE_DATA_SUPPORT_ALL); mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated( SUB_ID, false, entitlementPlmnList, barredPlmnList, new HashMap<>(), new HashMap<>(), dataServicePolicyMap, new HashMap<>(), mIIntegerConsumer); // Cap maxAllowedDataMode to SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED); doReturn(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED) .when(mMockConfig) .getSatelliteMaxAllowedDataMode(); int dataSupportModeForPlmn; dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00102"); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); // Cap maxAllowedDataMode to SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED); doReturn(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED) .when(mMockConfig) .getSatelliteMaxAllowedDataMode(); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00102"); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); // Cap maxAllowedDataMode to SATELLITE_DATA_SUPPORT_ALL mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_ALL); doReturn(SATELLITE_DATA_SUPPORT_ALL).when(mMockConfig).getSatelliteMaxAllowedDataMode(); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00102"); assertEquals(SATELLITE_DATA_SUPPORT_ALL, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ALL, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ALL, dataSupportModeForPlmn); } @Test public void testGetSupportedSatelliteDataModeForPlmn_WithoutEntitlement() throws Exception { logd("testGetSupportedSatelliteDataModeForPlmn_WithoutEntitlement"); mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_ALL); doReturn(SATELLITE_DATA_SUPPORT_ALL).when(mMockConfig).getSatelliteMaxAllowedDataMode(); replaceInstance(SatelliteController.class, "mMergedPlmnListPerCarrier", mSatelliteControllerUT, new SparseArray<>()); List<String> overlayConfigPlmnList = new ArrayList<>(); Loading Loading @@ -6753,6 +6917,131 @@ public class SatelliteControllerTest extends TelephonyTest { .getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); } @Test public void testGetSupportedSatelliteDataModeForPlmn_WithoutEntitlement_AllMaxAllowedDataMode() throws Exception { logd("testGetSupportedSatelliteDataModeForPlmn_WithoutEntitlement_AllMaxAllowedDataMode"); replaceInstance( SatelliteController.class, "mMergedPlmnListPerCarrier", mSatelliteControllerUT, new SparseArray<>()); List<String> overlayConfigPlmnList = new ArrayList<>(); replaceInstance( SatelliteController.class, "mSatellitePlmnListFromOverlayConfig", mSatelliteControllerUT, overlayConfigPlmnList); mCarrierConfigBundle.putBoolean( CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, true); // Without entitlement mCarrierConfigBundle.putBoolean( CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, false); List<String> entitlementPlmnList = Arrays.stream(new String[] {"00101", "00102", "00103", "00104"}).toList(); List<String> barredPlmnList = new ArrayList<>(); Map<String, Integer> dataServicePolicyMap = new HashMap<>(); mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated( SUB_ID, false, entitlementPlmnList, barredPlmnList, new HashMap<>(), new HashMap<>(), dataServicePolicyMap, new HashMap<>(), mIIntegerConsumer); // when Available satellite services is not configured with data service mCarrierConfigBundle.putInt( CarrierConfigManager.KEY_SATELLITE_DATA_SUPPORT_MODE_INT, SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED); int dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); setConfigData(new ArrayList<>()); PersistableBundle carrierSupportedSatelliteServicesPerProvider = new PersistableBundle(); List<String> carrierConfigPlmnList = List.of("00101"); carrierSupportedSatelliteServicesPerProvider.putIntArray( carrierConfigPlmnList.get(0), new int[] {2, 3, 5}); mCarrierConfigBundle.putPersistableBundle( CarrierConfigManager.KEY_CARRIER_SUPPORTED_SATELLITE_SERVICES_PER_PROVIDER_BUNDLE, carrierSupportedSatelliteServicesPerProvider); invokeCarrierConfigChanged(); // when Available satellite services support data service // And maxAllowedDataMode capped to SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED); doReturn(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED) .when(mMockConfig) .getSatelliteMaxAllowedDataMode(); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); // when Available satellite services support data service // And maxAllowedDataMode capped to SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED); doReturn(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED) .when(mMockConfig) .getSatelliteMaxAllowedDataMode(); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); // when Available satellite services support data service // And maxAllowedDataMode capped to SATELLITE_DATA_SUPPORT_ALL mContextFixture.putIntResource( com.android.internal.R.integer.max_allowed_data_mode, SATELLITE_DATA_SUPPORT_ALL); doReturn(SATELLITE_DATA_SUPPORT_ALL).when(mMockConfig).getSatelliteMaxAllowedDataMode(); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101"); assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT.getSatelliteDataServicePolicyForPlmn(SUB_ID, ""); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); dataSupportModeForPlmn = mSatelliteControllerUT .getSatelliteDataServicePolicyForPlmn(SUB_ID, null); assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn); Loading