Merge "Import translations. DO NOT MERGE ANYWHERE" into 24D1-dev
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 18c03ac..29ad29e 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -215,6 +215,7 @@
     private boolean mTryCsWhenPsFails;
     private boolean mTryEsFallback;
     private boolean mIsWaitingForDataDisconnection;
+    private boolean mSwitchRatPreferenceWithLocalNotRegistered;
     private int mModemCount;
 
     /** Indicates whether this instance is deactivated. */
@@ -445,7 +446,8 @@
         }
 
         if (mLastNetworkType == EUTRAN && mLastRegResult != null
-                && mSelectionAttributes.getPsDisconnectCause() != null) {
+                && mSelectionAttributes.getPsDisconnectCause() != null
+                && !mSwitchRatPreferenceWithLocalNotRegistered) {
             int regState = mLastRegResult.getRegState();
             int reasonCode = mSelectionAttributes.getPsDisconnectCause().getCode();
             if (reasonCode == ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED
@@ -453,6 +455,7 @@
                     && regState != REGISTRATION_STATE_ROAMING) {
                 // b/326292100, ePDN setup failed in limited state, request PS preferred scan.
                 mLastNetworkType = UNKNOWN;
+                mSwitchRatPreferenceWithLocalNotRegistered = true;
             }
         }
 
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 fab7256..53f3b8a 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -2882,6 +2882,7 @@
 
     @Test
     public void testDefaultLimitedServiceEutranFail() throws Exception {
+        mResultConsumer = null;
         createSelector(SLOT_0_SUB_ID);
         unsolBarringInfoChanged(false);
 
@@ -2894,14 +2895,36 @@
 
         bindImsServiceUnregistered();
 
-        verifyPsDialed();
+        processAllMessages();
+        verify(mWwanSelectorCallback, times(1)).onDomainSelected(eq(DOMAIN_PS), eq(true));
 
         attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, false, regResult,
                 new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, 0, null));
         mDomainSelector.reselectDomain(attr);
         processAllMessages();
 
-        verifyScanPsPreferred();
+        // Verify PS preferred scan
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), eq(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE),
+                anyBoolean(), any(), any());
+        assertEquals(EUTRAN, (int) mAccessNetwork.get(0));
+        assertNotNull(mResultConsumer);
+
+        regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
+                0, false, false, 0, 0, "", "");
+        mResultConsumer.accept(regResult);
+
+        processAllMessages();
+        verify(mWwanSelectorCallback, times(2)).onDomainSelected(eq(DOMAIN_PS), eq(true));
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify RAT preference change
+        verify(mWwanSelectorCallback, times(2)).onRequestEmergencyNetworkScan(
+                any(), eq(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE),
+                anyBoolean(), any(), any());
+        assertEquals(UTRAN, (int) mAccessNetwork.get(0));
     }
 
     @Test