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