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);