Merge "Keep PS preferred scan after VoLTE failure only once" into 24D1-dev
diff --git a/res/values/config.xml b/res/values/config.xml
index 5dae649..a934398 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -328,6 +328,16 @@
         <item>sg</item>
         <!-- b/198393826 -->
         <item>de</item>
+        <!-- b/334773484 -->
+        <item>gb</item>
+        <item>fr</item>
+        <item>be</item>
+        <item>ro</item>
+        <item>si</item>
+        <item>hr</item>
+        <item>gr</item>
+        <item>bg</item>
+        <item>my</item>
     </string-array>
 
     <!-- Array of countries that a normal service capable subscription is preferred
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
index 8353861..105dbd5 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
@@ -567,6 +567,12 @@
 
         // Clean up resources so that the new config data will be used when serving new requests
         cleanupOnDeviceAccessControllerResources();
+
+        // Clean up cached data based on previous geofence data
+        synchronized (mLock) {
+            logd("clear mCachedAccessRestrictionMap");
+            mCachedAccessRestrictionMap.clear();
+        }
     }
 
     private void loadOverlayConfigs(@NonNull Context context) {
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index f86e562..29ad29e 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -57,6 +57,7 @@
 import static android.telephony.PreciseDisconnectCause.EMERGENCY_TEMP_FAILURE;
 import static android.telephony.PreciseDisconnectCause.NO_VALID_SIM;
 import static android.telephony.PreciseDisconnectCause.SERVICE_OPTION_NOT_AVAILABLE;
+import static android.telephony.SubscriptionManager.PROFILE_CLASS_PROVISIONING;
 import static android.telephony.TelephonyManager.DATA_CONNECTED;
 import static android.telephony.TelephonyManager.DATA_DISCONNECTED;
 import static android.telephony.TelephonyManager.DATA_DISCONNECTING;
@@ -85,6 +86,7 @@
 import android.telephony.DomainSelectionService.SelectionAttributes;
 import android.telephony.EmergencyRegistrationResult;
 import android.telephony.NetworkRegistrationInfo;
+import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.telephony.TransportSelectorCallback;
@@ -1544,7 +1546,6 @@
     }
 
     private boolean allowEmergencyCalls(EmergencyRegistrationResult regResult) {
-        if (mModemCount < 2) return true;
         if (regResult == null) {
             loge("allowEmergencyCalls null regResult");
             return true;
@@ -1552,14 +1553,18 @@
 
         String iso = regResult.getCountryIso();
         if (sSimReadyAllowList.contains(iso)) {
-            TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
-            int simState = tm.getSimState(getSlotId());
-            if (simState != TelephonyManager.SIM_STATE_READY) {
-                logi("allowEmergencyCalls not ready, simState=" + simState + ", iso=" + iso);
-                if (mCrossSimRedialingController.isThereOtherSlot()) {
+            if (isSimReady()) {
+                SubscriptionManager sm = mContext.getSystemService(SubscriptionManager.class);
+                SubscriptionInfo subInfo = sm.getActiveSubscriptionInfo(getSubId());
+                if (subInfo != null
+                        && subInfo.getProfileClass() == PROFILE_CLASS_PROVISIONING) {
+                    // b/334773484, bootstrap profile
+                    logi("allowEmergencyCalls bootstrap profile, iso=" + iso);
                     return false;
                 }
-                logi("allowEmergencyCalls there is no other slot available");
+            } else {
+                logi("allowEmergencyCalls SIM state not ready, iso=" + iso);
+                return false;
             }
         }
 
@@ -1582,7 +1587,12 @@
 
     private void terminateSelectionPermanentlyForSlot() {
         logi("terminateSelectionPermanentlyForSlot");
-        terminateSelection(DisconnectCause.EMERGENCY_PERM_FAILURE);
+        mCrossSimRedialingController.notifyCallFailure(EMERGENCY_PERM_FAILURE);
+        if (mCrossSimRedialingController.isThereOtherSlot()) {
+            terminateSelection(DisconnectCause.EMERGENCY_PERM_FAILURE);
+        } else {
+            terminateSelection(DisconnectCause.ICC_ERROR);
+        }
     }
 
     private void terminateSelectionForCrossSimRedialing(boolean permanent) {
diff --git a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
index aabc0fb..8a29242 100644
--- a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
+++ b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
@@ -147,6 +147,9 @@
     SharedPreferences mMockSharedPreferences;
     @Mock
     private SharedPreferences.Editor mMockSharedPreferencesEditor;
+    @Mock
+    private Map<SatelliteOnDeviceAccessController.LocationToken, Boolean>
+            mMockCachedAccessRestrictionMap;
 
     private Looper mLooper;
     private TestableLooper mTestableLooper;
@@ -497,6 +500,9 @@
         assertSame(mConfigUpdateIntCaptor.getValue(), EVENT_CONFIG_DATA_UPDATED);
         assertSame(mConfigUpdateObjectCaptor.getValue(), mMockContext);
 
+        replaceInstance(SatelliteAccessController.class, "mCachedAccessRestrictionMap",
+                mSatelliteAccessControllerUT, mMockCachedAccessRestrictionMap);
+
         // These APIs are executed during loadRemoteConfigs
         verify(mMockSharedPreferences, times(1)).getStringSet(anyString(), any());
         verify(mMockSharedPreferences, times(1)).getBoolean(anyString(), anyBoolean());
@@ -509,6 +515,7 @@
 
         sendConfigUpdateChangedEvent(mMockContext);
         verify(mMockSharedPreferences, never()).edit();
+        verify(mMockCachedAccessRestrictionMap, never()).clear();
 
         // satelliteConfig has invalid country codes
         SatelliteConfig mockConfig = mock(SatelliteConfig.class);
@@ -518,6 +525,7 @@
 
         sendConfigUpdateChangedEvent(mMockContext);
         verify(mMockSharedPreferences, never()).edit();
+        verify(mMockCachedAccessRestrictionMap, never()).clear();
 
         // satelliteConfig does not have is_allow_access_control data
         doReturn(List.of(TEST_SATELLITE_COUNTRY_CODES))
@@ -526,6 +534,7 @@
 
         sendConfigUpdateChangedEvent(mMockContext);
         verify(mMockSharedPreferences, never()).edit();
+        verify(mMockCachedAccessRestrictionMap, never()).clear();
 
         // satelliteConfig doesn't have S2CellFile
         File mockFile = mock(File.class);
@@ -537,6 +546,7 @@
 
         sendConfigUpdateChangedEvent(mMockContext);
         verify(mMockSharedPreferences, never()).edit();
+        verify(mMockCachedAccessRestrictionMap, never()).clear();
 
         // satelliteConfig has valid data
         doReturn(mockConfig).when(mMockSatelliteController).getSatelliteConfig();
@@ -549,6 +559,7 @@
 
         sendConfigUpdateChangedEvent(mMockContext);
         verify(mMockSharedPreferences, times(2)).edit();
+        verify(mMockCachedAccessRestrictionMap, times(1)).clear();
     }
 
     private void sendConfigUpdateChangedEvent(Context context) {
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index 5fb3dde..53f3b8a 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -1840,9 +1840,8 @@
         bindImsServiceUnregistered();
         processAllMessages();
 
-        verify(mTransportSelectorCallback, times(0))
-                .onSelectionTerminated(eq(DisconnectCause.EMERGENCY_PERM_FAILURE));
-        verifyScanPsPreferred();
+        verify(mTransportSelectorCallback, times(1))
+                .onSelectionTerminated(eq(DisconnectCause.ICC_ERROR));
     }
 
     @Test