Loading src/java/com/android/internal/telephony/configupdate/TelephonyConfigUpdateInstallReceiver.java +37 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.data.DataUtils; import com.android.internal.telephony.satellite.SatelliteConfig; import com.android.internal.telephony.satellite.SatelliteConfigParser; import com.android.internal.telephony.satellite.SatelliteConstants; Loading Loading @@ -140,6 +141,37 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec return true; } /** * Validates if the max allowed datamode is valid * * @param parser target of validation. * @return {@code true} if max allowed datamode is valid, {@code false} otherwise. */ public boolean isValidMaxAllowedDataMode(@NonNull ConfigParser parser) { SatelliteConfig satelliteConfig = (SatelliteConfig) parser.getConfig(); if (satelliteConfig == null) { Log.e(TAG, "satelliteConfig is null"); mConfigUpdaterMetricsStats.reportOemAndCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_NO_SATELLITE_DATA); return false; } Integer maxAllowedDataMode = satelliteConfig.getSatelliteMaxAllowedDataMode(); if (maxAllowedDataMode == null) { Log.d(TAG, "maxAllowedDataMode is not set"); return true; } if (!DataUtils.isValidDataMode(maxAllowedDataMode)) { Log.e(TAG, "found invalid maxAllowedDataMode : " + maxAllowedDataMode); mConfigUpdaterMetricsStats.reportCarrierConfigError( SatelliteConstants .CONFIG_UPDATE_RESULT_CARRIER_DATA_INVALID_MAX_ALLOWED_DATA_MODE); return false; } Log.d(TAG, "maxAllowedDataMode is valid"); return true; } @Override @VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED) Loading @@ -163,6 +195,11 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec return; } if (!isValidMaxAllowedDataMode(newConfigParser)) { Log.e(TAG, "received config data has invalid max allowed data mode"); return; } synchronized (getInstance().mConfigParserLock) { if (getInstance().mConfigParser != null) { int updatedVersion = newConfigParser.mVersion; Loading src/java/com/android/internal/telephony/data/DataUtils.java +22 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.telephony.Annotation.DataActivityType; import android.telephony.Annotation.NetCapability; import android.telephony.Annotation.NetworkType; import android.telephony.Annotation.ValidationStatus; import android.telephony.CarrierConfigManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.telephony.data.ApnSetting.ApnType; Loading Loading @@ -502,4 +503,25 @@ public class DataUtils { private static void loge(String msg) { Rlog.e(TAG, msg); } /** * Checks if a given dataMode is valid or not. * * @param dataMode the data mode that needs to be validated. * @return {@code true} if data mode is valid, {@code false} otherwise. */ public static boolean isValidDataMode(int dataMode) { if (dataMode < CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED || CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL < dataMode) { loge( "Invalid data mode: " + dataMode + ". It's not within the allowed range of data mode: " + CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED + " - " + CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL); return false; } return true; } } src/java/com/android/internal/telephony/satellite/SatelliteConfig.java +114 −17 Original line number Diff line number Diff line Loading @@ -61,27 +61,68 @@ public class SatelliteConfig { private SatelliteConfigData.SatelliteConfigProto mConfigData; public SatelliteConfig(@NonNull SatelliteConfigData.SatelliteConfigProto configData) { logd("SatelliteConfig"); mConfigData = configData; mVersion = mConfigData.version; logd("mVersion: " + mVersion); buildCarrierSupportedServicesPerCarrier(); buildCarrierRoamingConfig(); buildDeviceSatelliteRegion(); } private void buildCarrierSupportedServicesPerCarrier() { logd("buildCarrierSupportedServicesPerCarrier"); if (mConfigData.carrierSupportedSatelliteServices == null) { logd("mSupportedServicesPerCarrier: empty"); } else { mSupportedServicesPerCarrier = getCarrierSupportedSatelliteServices(); if (mConfigData.carrierRoamingConfig != null) { logd("mSupportedServicesPerCarrier: " + mSupportedServicesPerCarrier); } } private void buildCarrierRoamingConfig() { logd("buildCarrierRoamingConfig"); if (mConfigData.carrierRoamingConfig == null) { logd("mConfigData.carrierRoamingConfig: empty"); } else { mCarrierRoamingMaxAllowedDataMode = mConfigData.carrierRoamingConfig.maxAllowedDataMode; logd("mCarrierRoamingMaxAllowedDataMode: " + mCarrierRoamingMaxAllowedDataMode); } } private void buildDeviceSatelliteRegion() { logd("buildDeviceSatelliteRegion"); if (mConfigData.deviceSatelliteRegion == null) { logd("mConfigData.deviceSatelliteRegion: empty"); } else { if (mConfigData.deviceSatelliteRegion.countryCodes == null) { logd("mConfigData.deviceSatelliteRegion.countryCodes is null, set empty list"); mSatelliteRegionCountryCodes = new ArrayList<>(); } else { mSatelliteRegionCountryCodes = List.of( mConfigData.deviceSatelliteRegion.countryCodes); logd("mSatelliteRegionCountryCodes: " + String.join(",", mSatelliteRegionCountryCodes)); } mIsSatelliteRegionAllowed = mConfigData.deviceSatelliteRegion.isAllowed; logd("mIsSatelliteRegionAllowed: " + mIsSatelliteRegionAllowed); mSatS2File = null; mSatelliteAccessConfigJsonFile = null; if (mConfigData.deviceSatelliteRegion.s2CellFile != null) { logd("s2CellFile size: " + mConfigData.deviceSatelliteRegion.s2CellFile.length); } else { logd("s2CellFile: empty"); } logd("mVersion:" + mVersion + " | " + "mSupportedServicesPerCarrier:" + mSupportedServicesPerCarrier + " | " + "mCarrierRoamingMaxAllowedDataMode:" + mCarrierRoamingMaxAllowedDataMode + " | " + "mSatelliteRegionCountryCodes:" + String.join(",", mSatelliteRegionCountryCodes) + " | " + "mIsSatelliteRegionAllowed:" + mIsSatelliteRegionAllowed + " | " + "s2CellFile size:" + mConfigData.deviceSatelliteRegion.s2CellFile.length + " | " + "satellite_access_config_json size:" mSatelliteAccessConfigJsonFile = null; if (mConfigData.deviceSatelliteRegion.satelliteAccessConfigFile != null) { logd("satellite_access_config_json size: " + mConfigData.deviceSatelliteRegion.satelliteAccessConfigFile.length); } else { logd("satellite_access_config_json: empty"); } } } /** Loading Loading @@ -329,6 +370,40 @@ public class SatelliteConfig { } } /** * This method cleans the Satellite Config OTA resources and it should be used only in CTS/Unit * tests */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public boolean hasSatelliteS2CellFile() { if (mConfigData != null && mConfigData.deviceSatelliteRegion != null) { if (mConfigData.deviceSatelliteRegion.s2CellFile != null && mConfigData.deviceSatelliteRegion.s2CellFile.length > 0) { logd("hasSatelliteS2CellFile: s2CellFile is exist"); return true; } } logd("hasSatelliteS2CellFile: s2CellFile is not exist"); return false; } /** * This method cleans the Satellite Config OTA resources and it should be used only in CTS/Unit * tests */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public boolean hasSatelliteAccessConfigFile() { if (mConfigData != null && mConfigData.deviceSatelliteRegion != null) { if (mConfigData.deviceSatelliteRegion.satelliteAccessConfigFile != null && mConfigData.deviceSatelliteRegion.satelliteAccessConfigFile.length > 0) { logd("hasSatelliteAccessConfigFile: satelliteAccessConfigFile is exist"); return true; } } logd("hasSatelliteAccessConfigFile: satelliteAccessConfigFile is not exist"); return false; } /** * @return {@code true} if the SatS2File is already existed and {@code false} otherwise. */ Loading @@ -348,4 +423,26 @@ public class SatelliteConfig { private static void loge(@NonNull String log) { Log.e(TAG, log); } @Override public String toString() { return "SatelliteConfig{" + "mVersion=" + mVersion + ", mSupportedServicesPerCarrier=" + mSupportedServicesPerCarrier + ", mCarrierRoamingMaxAllowedDataMode=" + mCarrierRoamingMaxAllowedDataMode + ", mSatelliteRegionCountryCodes=" + mSatelliteRegionCountryCodes + ", mIsSatelliteRegionAllowed=" + mIsSatelliteRegionAllowed + ", mSatS2File=" + mSatS2File + ", mSatelliteAccessConfigJsonFile=" + mSatelliteAccessConfigJsonFile + ", mConfigData=" + mConfigData + "}"; } } src/java/com/android/internal/telephony/satellite/SatelliteConfigParser.java +1 −2 Original line number Diff line number Diff line Loading @@ -27,7 +27,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; /** * SatelliteConfigParser parses the config data and create SatelliteConfig. * The config data is located at "/data/misc/telephonyconfig/telephony_config.pb". Loading Loading @@ -83,7 +82,7 @@ public class SatelliteConfigParser extends ConfigParser<SatelliteConfig> { Log.d(TAG, "SatelliteConfig is created"); } catch (Exception e) { parseError = true; Log.e(TAG, "Parse Error : " + e.getMessage()); Log.e(TAG, "Parse Error", e); } finally { if (parseError) { mVersion = VERSION_UNKNOWN; Loading src/java/com/android/internal/telephony/satellite/SatelliteConstants.java +19 −15 Original line number Diff line number Diff line Loading @@ -67,8 +67,11 @@ public class SatelliteConstants { public static final int CONFIG_UPDATE_RESULT_DEVICE_DATA_INVALID_S2_CELL_FILE = 10; public static final int CONFIG_UPDATE_RESULT_IO_ERROR = 11; public static final int CONFIG_UPDATE_RESULT_INVALID_SATELLITE_ACCESS_CONFIG_FILE = 12; public static final int CONFIG_UPDATE_RESULT_CARRIER_DATA_INVALID_MAX_ALLOWED_DATA_MODE = 13; @IntDef(prefix = {"CONFIG_UPDATE_RESULT_"}, value = { @IntDef( prefix = {"CONFIG_UPDATE_RESULT_"}, value = { CONFIG_UPDATE_RESULT_UNKNOWN, CONFIG_UPDATE_RESULT_SUCCESS, CONFIG_UPDATE_RESULT_INVALID_DOMAIN, Loading @@ -81,7 +84,8 @@ public class SatelliteConstants { CONFIG_UPDATE_RESULT_DEVICE_DATA_INVALID_COUNTRY_CODE, CONFIG_UPDATE_RESULT_DEVICE_DATA_INVALID_S2_CELL_FILE, CONFIG_UPDATE_RESULT_IO_ERROR, CONFIG_UPDATE_RESULT_INVALID_SATELLITE_ACCESS_CONFIG_FILE CONFIG_UPDATE_RESULT_INVALID_SATELLITE_ACCESS_CONFIG_FILE, CONFIG_UPDATE_RESULT_CARRIER_DATA_INVALID_MAX_ALLOWED_DATA_MODE }) @Retention(RetentionPolicy.SOURCE) public @interface ConfigUpdateResult {} Loading Loading
src/java/com/android/internal/telephony/configupdate/TelephonyConfigUpdateInstallReceiver.java +37 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.data.DataUtils; import com.android.internal.telephony.satellite.SatelliteConfig; import com.android.internal.telephony.satellite.SatelliteConfigParser; import com.android.internal.telephony.satellite.SatelliteConstants; Loading Loading @@ -140,6 +141,37 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec return true; } /** * Validates if the max allowed datamode is valid * * @param parser target of validation. * @return {@code true} if max allowed datamode is valid, {@code false} otherwise. */ public boolean isValidMaxAllowedDataMode(@NonNull ConfigParser parser) { SatelliteConfig satelliteConfig = (SatelliteConfig) parser.getConfig(); if (satelliteConfig == null) { Log.e(TAG, "satelliteConfig is null"); mConfigUpdaterMetricsStats.reportOemAndCarrierConfigError( SatelliteConstants.CONFIG_UPDATE_RESULT_NO_SATELLITE_DATA); return false; } Integer maxAllowedDataMode = satelliteConfig.getSatelliteMaxAllowedDataMode(); if (maxAllowedDataMode == null) { Log.d(TAG, "maxAllowedDataMode is not set"); return true; } if (!DataUtils.isValidDataMode(maxAllowedDataMode)) { Log.e(TAG, "found invalid maxAllowedDataMode : " + maxAllowedDataMode); mConfigUpdaterMetricsStats.reportCarrierConfigError( SatelliteConstants .CONFIG_UPDATE_RESULT_CARRIER_DATA_INVALID_MAX_ALLOWED_DATA_MODE); return false; } Log.d(TAG, "maxAllowedDataMode is valid"); return true; } @Override @VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED) Loading @@ -163,6 +195,11 @@ public class TelephonyConfigUpdateInstallReceiver extends ConfigUpdateInstallRec return; } if (!isValidMaxAllowedDataMode(newConfigParser)) { Log.e(TAG, "received config data has invalid max allowed data mode"); return; } synchronized (getInstance().mConfigParserLock) { if (getInstance().mConfigParser != null) { int updatedVersion = newConfigParser.mVersion; Loading
src/java/com/android/internal/telephony/data/DataUtils.java +22 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.telephony.Annotation.DataActivityType; import android.telephony.Annotation.NetCapability; import android.telephony.Annotation.NetworkType; import android.telephony.Annotation.ValidationStatus; import android.telephony.CarrierConfigManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.telephony.data.ApnSetting.ApnType; Loading Loading @@ -502,4 +503,25 @@ public class DataUtils { private static void loge(String msg) { Rlog.e(TAG, msg); } /** * Checks if a given dataMode is valid or not. * * @param dataMode the data mode that needs to be validated. * @return {@code true} if data mode is valid, {@code false} otherwise. */ public static boolean isValidDataMode(int dataMode) { if (dataMode < CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED || CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL < dataMode) { loge( "Invalid data mode: " + dataMode + ". It's not within the allowed range of data mode: " + CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED + " - " + CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL); return false; } return true; } }
src/java/com/android/internal/telephony/satellite/SatelliteConfig.java +114 −17 Original line number Diff line number Diff line Loading @@ -61,27 +61,68 @@ public class SatelliteConfig { private SatelliteConfigData.SatelliteConfigProto mConfigData; public SatelliteConfig(@NonNull SatelliteConfigData.SatelliteConfigProto configData) { logd("SatelliteConfig"); mConfigData = configData; mVersion = mConfigData.version; logd("mVersion: " + mVersion); buildCarrierSupportedServicesPerCarrier(); buildCarrierRoamingConfig(); buildDeviceSatelliteRegion(); } private void buildCarrierSupportedServicesPerCarrier() { logd("buildCarrierSupportedServicesPerCarrier"); if (mConfigData.carrierSupportedSatelliteServices == null) { logd("mSupportedServicesPerCarrier: empty"); } else { mSupportedServicesPerCarrier = getCarrierSupportedSatelliteServices(); if (mConfigData.carrierRoamingConfig != null) { logd("mSupportedServicesPerCarrier: " + mSupportedServicesPerCarrier); } } private void buildCarrierRoamingConfig() { logd("buildCarrierRoamingConfig"); if (mConfigData.carrierRoamingConfig == null) { logd("mConfigData.carrierRoamingConfig: empty"); } else { mCarrierRoamingMaxAllowedDataMode = mConfigData.carrierRoamingConfig.maxAllowedDataMode; logd("mCarrierRoamingMaxAllowedDataMode: " + mCarrierRoamingMaxAllowedDataMode); } } private void buildDeviceSatelliteRegion() { logd("buildDeviceSatelliteRegion"); if (mConfigData.deviceSatelliteRegion == null) { logd("mConfigData.deviceSatelliteRegion: empty"); } else { if (mConfigData.deviceSatelliteRegion.countryCodes == null) { logd("mConfigData.deviceSatelliteRegion.countryCodes is null, set empty list"); mSatelliteRegionCountryCodes = new ArrayList<>(); } else { mSatelliteRegionCountryCodes = List.of( mConfigData.deviceSatelliteRegion.countryCodes); logd("mSatelliteRegionCountryCodes: " + String.join(",", mSatelliteRegionCountryCodes)); } mIsSatelliteRegionAllowed = mConfigData.deviceSatelliteRegion.isAllowed; logd("mIsSatelliteRegionAllowed: " + mIsSatelliteRegionAllowed); mSatS2File = null; mSatelliteAccessConfigJsonFile = null; if (mConfigData.deviceSatelliteRegion.s2CellFile != null) { logd("s2CellFile size: " + mConfigData.deviceSatelliteRegion.s2CellFile.length); } else { logd("s2CellFile: empty"); } logd("mVersion:" + mVersion + " | " + "mSupportedServicesPerCarrier:" + mSupportedServicesPerCarrier + " | " + "mCarrierRoamingMaxAllowedDataMode:" + mCarrierRoamingMaxAllowedDataMode + " | " + "mSatelliteRegionCountryCodes:" + String.join(",", mSatelliteRegionCountryCodes) + " | " + "mIsSatelliteRegionAllowed:" + mIsSatelliteRegionAllowed + " | " + "s2CellFile size:" + mConfigData.deviceSatelliteRegion.s2CellFile.length + " | " + "satellite_access_config_json size:" mSatelliteAccessConfigJsonFile = null; if (mConfigData.deviceSatelliteRegion.satelliteAccessConfigFile != null) { logd("satellite_access_config_json size: " + mConfigData.deviceSatelliteRegion.satelliteAccessConfigFile.length); } else { logd("satellite_access_config_json: empty"); } } } /** Loading Loading @@ -329,6 +370,40 @@ public class SatelliteConfig { } } /** * This method cleans the Satellite Config OTA resources and it should be used only in CTS/Unit * tests */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public boolean hasSatelliteS2CellFile() { if (mConfigData != null && mConfigData.deviceSatelliteRegion != null) { if (mConfigData.deviceSatelliteRegion.s2CellFile != null && mConfigData.deviceSatelliteRegion.s2CellFile.length > 0) { logd("hasSatelliteS2CellFile: s2CellFile is exist"); return true; } } logd("hasSatelliteS2CellFile: s2CellFile is not exist"); return false; } /** * This method cleans the Satellite Config OTA resources and it should be used only in CTS/Unit * tests */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public boolean hasSatelliteAccessConfigFile() { if (mConfigData != null && mConfigData.deviceSatelliteRegion != null) { if (mConfigData.deviceSatelliteRegion.satelliteAccessConfigFile != null && mConfigData.deviceSatelliteRegion.satelliteAccessConfigFile.length > 0) { logd("hasSatelliteAccessConfigFile: satelliteAccessConfigFile is exist"); return true; } } logd("hasSatelliteAccessConfigFile: satelliteAccessConfigFile is not exist"); return false; } /** * @return {@code true} if the SatS2File is already existed and {@code false} otherwise. */ Loading @@ -348,4 +423,26 @@ public class SatelliteConfig { private static void loge(@NonNull String log) { Log.e(TAG, log); } @Override public String toString() { return "SatelliteConfig{" + "mVersion=" + mVersion + ", mSupportedServicesPerCarrier=" + mSupportedServicesPerCarrier + ", mCarrierRoamingMaxAllowedDataMode=" + mCarrierRoamingMaxAllowedDataMode + ", mSatelliteRegionCountryCodes=" + mSatelliteRegionCountryCodes + ", mIsSatelliteRegionAllowed=" + mIsSatelliteRegionAllowed + ", mSatS2File=" + mSatS2File + ", mSatelliteAccessConfigJsonFile=" + mSatelliteAccessConfigJsonFile + ", mConfigData=" + mConfigData + "}"; } }
src/java/com/android/internal/telephony/satellite/SatelliteConfigParser.java +1 −2 Original line number Diff line number Diff line Loading @@ -27,7 +27,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; /** * SatelliteConfigParser parses the config data and create SatelliteConfig. * The config data is located at "/data/misc/telephonyconfig/telephony_config.pb". Loading Loading @@ -83,7 +82,7 @@ public class SatelliteConfigParser extends ConfigParser<SatelliteConfig> { Log.d(TAG, "SatelliteConfig is created"); } catch (Exception e) { parseError = true; Log.e(TAG, "Parse Error : " + e.getMessage()); Log.e(TAG, "Parse Error", e); } finally { if (parseError) { mVersion = VERSION_UNKNOWN; Loading
src/java/com/android/internal/telephony/satellite/SatelliteConstants.java +19 −15 Original line number Diff line number Diff line Loading @@ -67,8 +67,11 @@ public class SatelliteConstants { public static final int CONFIG_UPDATE_RESULT_DEVICE_DATA_INVALID_S2_CELL_FILE = 10; public static final int CONFIG_UPDATE_RESULT_IO_ERROR = 11; public static final int CONFIG_UPDATE_RESULT_INVALID_SATELLITE_ACCESS_CONFIG_FILE = 12; public static final int CONFIG_UPDATE_RESULT_CARRIER_DATA_INVALID_MAX_ALLOWED_DATA_MODE = 13; @IntDef(prefix = {"CONFIG_UPDATE_RESULT_"}, value = { @IntDef( prefix = {"CONFIG_UPDATE_RESULT_"}, value = { CONFIG_UPDATE_RESULT_UNKNOWN, CONFIG_UPDATE_RESULT_SUCCESS, CONFIG_UPDATE_RESULT_INVALID_DOMAIN, Loading @@ -81,7 +84,8 @@ public class SatelliteConstants { CONFIG_UPDATE_RESULT_DEVICE_DATA_INVALID_COUNTRY_CODE, CONFIG_UPDATE_RESULT_DEVICE_DATA_INVALID_S2_CELL_FILE, CONFIG_UPDATE_RESULT_IO_ERROR, CONFIG_UPDATE_RESULT_INVALID_SATELLITE_ACCESS_CONFIG_FILE CONFIG_UPDATE_RESULT_INVALID_SATELLITE_ACCESS_CONFIG_FILE, CONFIG_UPDATE_RESULT_CARRIER_DATA_INVALID_MAX_ALLOWED_DATA_MODE }) @Retention(RetentionPolicy.SOURCE) public @interface ConfigUpdateResult {} Loading