Update TelephonyConfigUpdateReceiver
Bug: 319609096
Test: build
Test: atest com.android.phone.satellite.accesscontrol.SatelliteAccessControllerTest
Change-Id: I2a6b9cdcb48003518d629e15b7975762ddc108d1
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 074de4a..5c8504a 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -169,6 +169,9 @@
<!-- Needed to register for UWB state changes for satellite communication -->
<uses-permission android:name="android.permission.UWB_PRIVILEGED"/>
+ <!-- Needed to initiate configuration update -->
+ <uses-permission android:name="android.permission.UPDATE_CONFIG"/>
+
<!-- Needed to bind the domain selection service. -->
<uses-permission android:name="android.permission.BIND_DOMAIN_SELECTION_SERVICE" />
@@ -577,6 +580,16 @@
</intent-filter>
</receiver>
+ <!-- Update configuration data file -->
+ <receiver android:name="com.android.internal.telephony.configupdate.TelephonyConfigUpdateInstallReceiver"
+ android:exported="true"
+ android:permission="android.permission.UPDATE_CONFIG">
+ <intent-filter>
+ <action android:name="android.os.action.UPDATE_CONFIG" />
+ <data android:scheme="content" android:host="*" android:mimeType="*/*" />
+ </intent-filter>
+ </receiver>
+
<receiver
android:name="com.android.internal.telephony.uicc.ShowInstallAppNotificationReceiver"
android:exported="false"/>
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
index 76032f8..36280e9 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
@@ -51,6 +51,7 @@
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.TelephonyCountryDetector;
import com.android.internal.telephony.flags.FeatureFlags;
+import com.android.internal.telephony.satellite.SatelliteConfig;
import com.android.internal.telephony.satellite.SatelliteController;
import com.android.phone.PhoneGlobals;
@@ -106,6 +107,7 @@
private static final int CMD_IS_SATELLITE_COMMUNICATION_ALLOWED = 1;
protected static final int EVENT_WAIT_FOR_CURRENT_LOCATION_TIMEOUT = 2;
protected static final int EVENT_KEEP_ON_DEVICE_ACCESS_CONTROLLER_RESOURCES_TIMEOUT = 3;
+ protected static final int EVENT_CONFIG_DATA_UPDATED = 4;
private static SatelliteAccessController sInstance;
@@ -176,6 +178,8 @@
mCountryDetector = TelephonyCountryDetector.getInstance(context);
mSatelliteController = SatelliteController.getInstance();
loadOverlayConfigs(context);
+ mSatelliteController.registerForConfigUpdateChanged(this, EVENT_CONFIG_DATA_UPDATED,
+ context);
if (s2CellFile != null) {
mSatelliteS2CellFile = s2CellFile;
}
@@ -215,6 +219,9 @@
case EVENT_KEEP_ON_DEVICE_ACCESS_CONTROLLER_RESOURCES_TIMEOUT:
cleanupOnDeviceAccessControllerResources();
break;
+ case EVENT_CONFIG_DATA_UPDATED:
+ updateSatelliteConfigData((Context) msg.obj);
+ break;
default:
logw("SatelliteAccessControllerHandler: unexpected message code: " + msg.what);
break;
@@ -338,6 +345,59 @@
return SystemClock.elapsedRealtimeNanos();
}
+ /**
+ * Update country codes, S2CellFile and satellite region allowed by ConfigUpdater
+ * or CarrierConfig
+ */
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+ public void updateSatelliteConfigData(Context context) {
+ logd("updateSatelliteConfigData");
+
+ SatelliteConfig satelliteConfig = mSatelliteController.getSatelliteConfig();
+ if (satelliteConfig != null && satelliteConfig.getSatelliteS2CellFile(context) != null) {
+ logd("Check mSatelliteS2CellFile from ConfigUpdater");
+ Path pathSatelliteS2CellFile = satelliteConfig.getSatelliteS2CellFile(context);
+ mSatelliteS2CellFile = pathSatelliteS2CellFile.toFile();
+ if (mSatelliteS2CellFile != null && !mSatelliteS2CellFile.exists()) {
+ loge("The satellite S2 cell file " + mSatelliteS2CellFile.getName()
+ + " does not exist");
+ mSatelliteS2CellFile = null;
+ }
+ }
+
+ if (mSatelliteS2CellFile == null) {
+ logd("Check mSatelliteS2CellFile from CarrierConfig");
+ String satelliteS2CellFileName = getSatelliteS2CellFileFromOverlayConfig(context);
+ mSatelliteS2CellFile = TextUtils.isEmpty(satelliteS2CellFileName)
+ ? null : new File(satelliteS2CellFileName);
+ if (mSatelliteS2CellFile != null && !mSatelliteS2CellFile.exists()) {
+ loge("The satellite S2 cell file " + mSatelliteS2CellFile.getName()
+ + " does not exist");
+ mSatelliteS2CellFile = null;
+ }
+ }
+
+ if (mSatelliteS2CellFile == null) {
+ logd("Since mSatelliteS2CellFile is null, don't need to refer other configurations");
+ return;
+ }
+
+ if (satelliteConfig != null
+ && !satelliteConfig.getDeviceSatelliteCountryCodes().isEmpty()) {
+ logd("update mSatelliteCountryCodes by ConfigUpdater");
+ mSatelliteCountryCodes = satelliteConfig.getDeviceSatelliteCountryCodes();
+ } else {
+ mSatelliteCountryCodes = getSatelliteCountryCodesFromOverlayConfig(context);
+ }
+
+ if (satelliteConfig != null && satelliteConfig.isSatelliteDataForAllowedRegion() != null) {
+ logd("update mIsSatelliteAllowAccessControl by ConfigUpdater");
+ mIsSatelliteAllowAccessControl = satelliteConfig.isSatelliteDataForAllowedRegion();
+ } else {
+ mIsSatelliteAllowAccessControl = getSatelliteAccessAllowFromOverlayConfig(context);
+ }
+ }
+
private void loadOverlayConfigs(@NonNull Context context) {
mSatelliteCountryCodes = getSatelliteCountryCodesFromOverlayConfig(context);
mIsSatelliteAllowAccessControl = getSatelliteAccessAllowFromOverlayConfig(context);
diff --git a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
index c44b347..e6f70aa 100644
--- a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
+++ b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
@@ -23,6 +23,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
@@ -31,7 +32,11 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -57,6 +62,8 @@
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.TelephonyCountryDetector;
import com.android.internal.telephony.flags.FeatureFlags;
+import com.android.internal.telephony.satellite.SatelliteConfig;
+import com.android.internal.telephony.satellite.SatelliteConfigParser;
import com.android.internal.telephony.satellite.SatelliteController;
import org.junit.After;
@@ -70,6 +77,8 @@
import java.io.File;
import java.lang.reflect.Field;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -531,6 +540,42 @@
assertTrue(mQueriedSatelliteAllowed);
}
+ @Test
+ public void testUpdateSatelliteConfigData() {
+ // Verify the case when the configParser is not exist.
+ SatelliteConfigParser spyConfigParserNull =
+ spy(new SatelliteConfigParser((byte[]) null));
+ doReturn(spyConfigParserNull).when(mMockSatelliteController).getSatelliteConfigParser();
+ mSatelliteAccessControllerUT.updateSatelliteConfigData(mMockContext);
+
+ assertNull(spyConfigParserNull.getConfig());
+
+ // Verify the case when the configParser is exist but empty.
+ SatelliteConfigParser spyConfigParserEmpty =
+ spy(new SatelliteConfigParser("test".getBytes()));
+ doReturn(spyConfigParserEmpty).when(mMockSatelliteController).getSatelliteConfigParser();
+ mSatelliteAccessControllerUT.updateSatelliteConfigData(mMockContext);
+
+ assertNull(spyConfigParserEmpty.getConfig());
+
+ // Verify the case when the configParser is exist and valid data
+ SatelliteConfig mockSatelliteConfig = mock(SatelliteConfig.class);
+ final String filePath = "/data/user_de/0/com.android.phone/app_satellite/s2_cell_file";
+ Path targetSatS2FilePath = Paths.get(filePath);
+ doReturn(false).when(mockSatelliteConfig).isFileExist(any());
+ doReturn(targetSatS2FilePath).when(mockSatelliteConfig)
+ .copySatS2FileToPhoneDirectory(any(), any());
+ doReturn(Arrays.asList("US")).when(mockSatelliteConfig).getDeviceSatelliteCountryCodes();
+ doReturn(false).when(mockSatelliteConfig).isSatelliteDataForAllowedRegion();
+ doReturn(targetSatS2FilePath).when(mockSatelliteConfig).getSatelliteS2CellFile(any());
+ doReturn(mockSatelliteConfig).when(mMockSatelliteController).getSatelliteConfig();
+
+ mSatelliteAccessControllerUT.updateSatelliteConfigData(mMockContext);
+ verify(mockSatelliteConfig, times(0)).getDeviceSatelliteCountryCodes();
+ verify(mockSatelliteConfig, times(0)).isSatelliteDataForAllowedRegion();
+ verify(mockSatelliteConfig, times(2)).getSatelliteS2CellFile(any());
+ }
+
private void clearAllInvocations() {
clearInvocations(mMockSatelliteController);
clearInvocations(mMockSatelliteOnDeviceAccessController);