Merge "Fix to be testable on TestApp." into main
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 2fe2838..7012e67 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -848,7 +848,7 @@
<string name="enforce_satellite_channel_string" msgid="295306734591329892">"LTE satelīta kanāla piespiedu izmantošana (tikai atkļūdošanas būvējums)"</string>
<string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mobilo sakaru operatora satelīta režīma imitēšana (tikai atkļūdošanas būvējums)"</string>
<string name="esos_satellite_string" msgid="7274794226125968657">"Izmēģināt īsta satelīta eSOS režīmu (tikai atkļūdošanas būvējumā)"</string>
- <string name="satellite_enable_non_emergency_mode_string" msgid="9005332650950637932">"Izmēģināt īsta satelīta eSOS režīmu (tikai atkļūdošanas būvējumā)"</string>
+ <string name="satellite_enable_non_emergency_mode_string" msgid="9005332650950637932">"Izmēģināt īsta satelīta režīmu, kas nav eSOS režīms (tikai atkļūdošanas būvējumā)"</string>
<string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Skatīt SIM adrešu grāmatu"</string>
<string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Skatīt ierobežotā zvanu saraksta numurus"</string>
<string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Pakalpojuma iezvanes numuru skatīšana"</string>
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 4d83447..611b6a2 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -9322,11 +9322,17 @@
*/
@Override
public void getCarrierRestrictionStatus(IIntegerConsumer callback, String packageName) {
- enforceReadPermission("getCarrierRestrictionStatus");
-
+ String functionName = "getCarrierRestrictionStatus";
enforceTelephonyFeatureWithException(packageName,
- PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION, "getCarrierRestrictionStatus");
-
+ PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION, functionName);
+ try {
+ mApp.enforceCallingOrSelfPermission(
+ android.Manifest.permission.READ_BASIC_PHONE_STATE,
+ functionName);
+ } catch (SecurityException e) {
+ mApp.enforceCallingOrSelfPermission(permission.READ_PHONE_STATE,
+ functionName);
+ }
Set<Integer> carrierIds = validateCallerAndGetCarrierIds(packageName);
if (carrierIds.contains(CarrierAllowListInfo.INVALID_CARRIER_ID)) {
Rlog.e(LOG_TAG, "getCarrierRestrictionStatus: caller is not registered");
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 163fc26..412e44a 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -1201,17 +1201,20 @@
}
}
+ boolean forNormalRoutingEmergencyCall = false;
if (mDomainSelectionResolver.isDomainSelectionSupported()) {
- // Normal routing emergency number shall be handled by normal call domain selector.
- int routing = (isEmergencyNumber)
- ? getEmergencyCallRouting(phone, number, needToTurnOnRadio)
- : EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN;
- if (isEmergencyNumber && routing != EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL) {
- final Connection resultConnection =
- placeEmergencyConnection(phone,
- request, numberToDial, isTestEmergencyNumber,
- handle, needToTurnOnRadio, routing);
- if (resultConnection != null) return resultConnection;
+ if (isEmergencyNumber) {
+ // Normal routing emergency number shall be handled by normal call domain selector.
+ int routing = getEmergencyCallRouting(phone, number, needToTurnOnRadio);
+ if (routing != EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL) {
+ final Connection resultConnection =
+ placeEmergencyConnection(phone,
+ request, numberToDial, isTestEmergencyNumber,
+ handle, needToTurnOnRadio, routing);
+ if (resultConnection != null) return resultConnection;
+ }
+ forNormalRoutingEmergencyCall = true;
+ Log.d(this, "onCreateOutgoingConnection, forNormalRoutingEmergencyCall");
}
}
@@ -1300,7 +1303,7 @@
}
}
}, isEmergencyNumber && !isTestEmergencyNumber, phone, isTestEmergencyNumber,
- timeoutToOnTimeoutCallback);
+ timeoutToOnTimeoutCallback, forNormalRoutingEmergencyCall);
// Return the still unconnected GsmConnection and wait for the Radios to boot before
// connecting it to the underlying Phone.
return resultConnection;
diff --git a/src/com/android/services/telephony/domainselection/CrossSimRedialingController.java b/src/com/android/services/telephony/domainselection/CrossSimRedialingController.java
index d368d46..3a69459 100644
--- a/src/com/android/services/telephony/domainselection/CrossSimRedialingController.java
+++ b/src/com/android/services/telephony/domainselection/CrossSimRedialingController.java
@@ -227,6 +227,8 @@
if (isThereOtherSlot()) {
mSelector.notifyCrossStackTimerExpired();
+ } else if (!mPermanentRejectedSlots.isEmpty()) {
+ mSelector.maybeHangupOngoingDialing();
}
}
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index 3946d1a..0d373de 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -925,8 +925,7 @@
requestScan(true);
return;
}
- // If NGRAN, request scan to trigger emergency registration.
- if (mPsNetworkType == EUTRAN) {
+ if (mPsNetworkType != UNKNOWN) {
onWwanNetworkTypeSelected(mPsNetworkType);
} else if (mCsNetworkType != UNKNOWN) {
checkAndSetTerminateAfterCsFailure(mLastRegResult);
@@ -1344,13 +1343,19 @@
int accessNetwork = regResult.getAccessNetwork();
List<Integer> ratList = getImsNetworkTypeConfiguration();
+ if (!inService && !ratList.contains(NGRAN) && !isSimReady()
+ && !TextUtils.isEmpty(regResult.getCountryIso())) {
+ ratList.add(NGRAN);
+ logi("getSelectablePsNetworkType ratList=" + ratList);
+ }
if (ratList.contains(accessNetwork)) {
if (mIsEmergencyBarred) {
logi("getSelectablePsNetworkType barred");
return UNKNOWN;
}
if (accessNetwork == NGRAN) {
- return (regResult.getNwProvidedEmc() > 0 && regResult.isVopsSupported())
+ return (regResult.getNwProvidedEmc() > 0
+ && (regResult.isVopsSupported() || !inService))
? NGRAN : UNKNOWN;
} else if (accessNetwork == EUTRAN) {
return (regResult.isEmcBearerSupported()
@@ -1845,6 +1850,18 @@
terminateSelectionForCrossSimRedialing(isHangupOngoingDialing);
}
+ /**
+ * If another slot has already permanently failed,
+ * and IMS REG is not completed in the current slot, hang up the ongoing call.
+ */
+ public void maybeHangupOngoingDialing() {
+ logi("maybeHangupOngoingDialing");
+
+ if (mDomainSelected && hangupOngoingDialing()) {
+ notifyCrossStackTimerExpired();
+ }
+ }
+
private boolean hangupOngoingDialing() {
return Flags.hangupEmergencyCallForCrossSimRedialing()
&& (mCallSetupTimerOnCurrentRat > 0)
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
index 54bb16d..9c75a84 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
@@ -33,6 +33,7 @@
import android.telephony.satellite.stub.SatelliteCapabilities;
import android.telephony.satellite.stub.SatelliteDatagram;
import android.telephony.satellite.stub.SatelliteImplBase;
+import android.telephony.satellite.stub.SatelliteModemEnableRequestAttributes;
import android.telephony.satellite.stub.SatelliteModemState;
import android.telephony.satellite.stub.SatelliteResult;
import android.telephony.satellite.stub.SatelliteService;
@@ -184,21 +185,25 @@
}
@Override
- public void requestSatelliteEnabled(boolean enableSatellite, boolean enableDemoMode,
- boolean isEmergency, @NonNull IIntegerConsumer errorCallback) {
- logd("requestSatelliteEnabled: mErrorCode=" + mErrorCode + " enable = " + enableSatellite
- + " isEmergency=" + isEmergency);
+ public void requestSatelliteEnabled(SatelliteModemEnableRequestAttributes enableAttributes,
+ @NonNull IIntegerConsumer errorCallback) {
+ logd("requestSatelliteEnabled: mErrorCode=" + mErrorCode
+ + ", isEnabled=" + enableAttributes.isEnabled
+ + ", isDemoMode=" + enableAttributes.isDemoMode
+ + ", isEmergency= " + enableAttributes.isEmergencyMode
+ + ", iccId=" + enableAttributes.satelliteSubscriptionInfo.iccId
+ + ", niddApn=" + enableAttributes.satelliteSubscriptionInfo.niddApn);
if (mErrorCode != SatelliteResult.SATELLITE_RESULT_SUCCESS) {
runWithExecutor(() -> errorCallback.accept(mErrorCode));
return;
}
- if (enableSatellite) {
+ if (enableAttributes.isEnabled) {
enableSatellite(errorCallback);
} else {
disableSatellite(errorCallback);
}
- mIsEmergnecy = isEmergency;
+ mIsEmergnecy = enableAttributes.isEmergencyMode;
}
private void enableSatellite(@NonNull IIntegerConsumer errorCallback) {
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
index 97c3d44..6242710 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
@@ -1306,7 +1306,7 @@
ArgumentCaptor<RadioOnStateListener.Callback> callback =
ArgumentCaptor.forClass(RadioOnStateListener.Callback.class);
verify(mRadioOnHelper).triggerRadioOnAndListen(callback.capture(), eq(true),
- eq(testPhone), eq(false), eq(0));
+ eq(testPhone), eq(false), eq(0), eq(false));
assertFalse(callback.getValue()
.isOkToCall(testPhone, ServiceState.STATE_OUT_OF_SERVICE, false));
@@ -1334,7 +1334,7 @@
ArgumentCaptor<RadioOnStateListener.Callback> callback =
ArgumentCaptor.forClass(RadioOnStateListener.Callback.class);
verify(mRadioOnHelper).triggerRadioOnAndListen(callback.capture(), eq(true),
- eq(testPhone), eq(false), eq(0));
+ eq(testPhone), eq(false), eq(0), eq(false));
assertFalse(callback.getValue()
.isOkToCall(testPhone, ServiceState.STATE_OUT_OF_SERVICE, false));
@@ -1446,7 +1446,7 @@
ArgumentCaptor<RadioOnStateListener.Callback> callback =
ArgumentCaptor.forClass(RadioOnStateListener.Callback.class);
verify(mRadioOnHelper).triggerRadioOnAndListen(callback.capture(), eq(true),
- eq(testPhone), eq(false), eq(0));
+ eq(testPhone), eq(false), eq(0), eq(false));
assertFalse(callback.getValue()
.isOkToCall(testPhone, ServiceState.STATE_OUT_OF_SERVICE, false));
@@ -1546,7 +1546,7 @@
PHONE_ACCOUNT_HANDLE_1, connectionRequest);
verify(mRadioOnHelper).triggerRadioOnAndListen(any(), eq(false),
- eq(testPhone0), eq(false), eq(0));
+ eq(testPhone0), eq(false), eq(0), eq(false));
}
/**
@@ -1580,7 +1580,7 @@
PHONE_ACCOUNT_HANDLE_1, connectionRequest);
verify(mRadioOnHelper).triggerRadioOnAndListen(any(), eq(false),
- eq(testPhone0), eq(false), eq(0));
+ eq(testPhone0), eq(false), eq(0), eq(false));
}
/**
@@ -1613,7 +1613,7 @@
PHONE_ACCOUNT_HANDLE_1, connectionRequest);
verify(mRadioOnHelper, times(0)).triggerRadioOnAndListen(any(),
- eq(true), eq(testPhone0), eq(false), eq(0));
+ eq(true), eq(testPhone0), eq(false), eq(0), eq(false));
}
/**
@@ -2761,7 +2761,7 @@
ArgumentCaptor<RadioOnStateListener.Callback> callback =
ArgumentCaptor.forClass(RadioOnStateListener.Callback.class);
verify(mRadioOnHelper).triggerRadioOnAndListen(callback.capture(), eq(true),
- eq(testPhone), eq(false), eq(TIMEOUT_TO_DYNAMIC_ROUTING_MS));
+ eq(testPhone), eq(false), eq(TIMEOUT_TO_DYNAMIC_ROUTING_MS), eq(true));
ServiceState ss = new ServiceState();
ss.setState(ServiceState.STATE_OUT_OF_SERVICE);
@@ -2800,7 +2800,7 @@
ArgumentCaptor<RadioOnStateListener.Callback> callback =
ArgumentCaptor.forClass(RadioOnStateListener.Callback.class);
verify(mRadioOnHelper).triggerRadioOnAndListen(callback.capture(), eq(true),
- eq(testPhone), eq(false), eq(TIMEOUT_TO_DYNAMIC_ROUTING_MS));
+ eq(testPhone), eq(false), eq(TIMEOUT_TO_DYNAMIC_ROUTING_MS), eq(true));
ServiceState ss = new ServiceState();
ss.setState(ServiceState.STATE_OUT_OF_SERVICE);
@@ -2825,7 +2825,7 @@
ArgumentCaptor<RadioOnStateListener.Callback> callback =
ArgumentCaptor.forClass(RadioOnStateListener.Callback.class);
verify(mRadioOnHelper).triggerRadioOnAndListen(callback.capture(), eq(true),
- eq(testPhone), eq(false), eq(TIMEOUT_TO_DYNAMIC_ROUTING_MS));
+ eq(testPhone), eq(false), eq(TIMEOUT_TO_DYNAMIC_ROUTING_MS), eq(true));
ServiceState ss = new ServiceState();
ss.setState(ServiceState.STATE_IN_SERVICE);
@@ -2861,7 +2861,7 @@
ArgumentCaptor<RadioOnStateListener.Callback> callback =
ArgumentCaptor.forClass(RadioOnStateListener.Callback.class);
verify(mRadioOnHelper).triggerRadioOnAndListen(callback.capture(), eq(true),
- eq(testPhone), eq(false), eq(TIMEOUT_TO_DYNAMIC_ROUTING_MS));
+ eq(testPhone), eq(false), eq(TIMEOUT_TO_DYNAMIC_ROUTING_MS), eq(true));
ServiceState ss = new ServiceState();
ss.setState(ServiceState.STATE_IN_SERVICE);
@@ -2898,7 +2898,7 @@
ArgumentCaptor<RadioOnStateListener.Callback> callback =
ArgumentCaptor.forClass(RadioOnStateListener.Callback.class);
verify(mRadioOnHelper).triggerRadioOnAndListen(callback.capture(), eq(true),
- eq(testPhone), eq(false), eq(TIMEOUT_TO_DYNAMIC_ROUTING_MS));
+ eq(testPhone), eq(false), eq(TIMEOUT_TO_DYNAMIC_ROUTING_MS), eq(true));
ServiceState ss = new ServiceState();
ss.setState(ServiceState.STATE_IN_SERVICE);
@@ -2935,7 +2935,7 @@
ArgumentCaptor<RadioOnStateListener.Callback> callback =
ArgumentCaptor.forClass(RadioOnStateListener.Callback.class);
verify(mRadioOnHelper).triggerRadioOnAndListen(callback.capture(), eq(true),
- eq(testPhone), eq(false), eq(TIMEOUT_TO_DYNAMIC_ROUTING_MS));
+ eq(testPhone), eq(false), eq(TIMEOUT_TO_DYNAMIC_ROUTING_MS), eq(true));
mConnection.setDisconnected(null);
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index 90446af..8a83ab0 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -3612,7 +3612,108 @@
EmergencyRegistrationResult regResult = getEmergencyRegResult(NGRAN,
REGISTRATION_STATE_UNKNOWN,
- 0, false, true, 0, 0, "", "");
+ 0, false, true, 1, 0, "", "", "us");
+ SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+ mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+ processAllMessages();
+
+ bindImsServiceUnregistered();
+
+ verifyScanPsPreferred();
+ }
+
+ @Test
+ public void testNrSaOnlyLimitedServiceNgranEmc() throws Exception {
+ PersistableBundle bundle = getDefaultPersistableBundle();
+ bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+ new int[] { NGRAN, EUTRAN });
+ when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+
+ createSelector(SLOT_0_SUB_ID);
+ unsolBarringInfoChanged(false);
+
+ EmergencyRegistrationResult regResult = getEmergencyRegResult(NGRAN,
+ REGISTRATION_STATE_UNKNOWN,
+ 0, false, false, 1, 0, "", "", "us");
+ SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+ mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+ processAllMessages();
+
+ bindImsServiceUnregistered();
+
+ verifyPsDialed();
+ }
+
+ @Test
+ public void testNrSaOnlyLimitedServiceNgranNoEmc() throws Exception {
+ PersistableBundle bundle = getDefaultPersistableBundle();
+ bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+ new int[] { NGRAN, EUTRAN });
+ when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+
+ createSelector(SLOT_0_SUB_ID);
+ unsolBarringInfoChanged(false);
+
+ EmergencyRegistrationResult regResult = getEmergencyRegResult(NGRAN,
+ REGISTRATION_STATE_UNKNOWN,
+ 0, false, false, 0, 0, "", "", "us");
+ SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+ mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+ processAllMessages();
+
+ bindImsServiceUnregistered();
+
+ verifyScanPreferred(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE, NGRAN);
+ }
+
+ @Test
+ public void testDefaultLimitedServiceNgranEmcWhenSimNotReady() throws Exception {
+ createSelector(SLOT_0_SUB_ID);
+ unsolBarringInfoChanged(false);
+ doReturn(TelephonyManager.SIM_STATE_PIN_REQUIRED)
+ .when(mTelephonyManager).getSimState(anyInt());
+
+ EmergencyRegistrationResult regResult = getEmergencyRegResult(NGRAN,
+ REGISTRATION_STATE_UNKNOWN,
+ 0, false, false, 1, 0, "", "", "us");
+ SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+ mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+ processAllMessages();
+
+ bindImsServiceUnregistered();
+
+ verifyPsDialed();
+ }
+
+ @Test
+ public void testDefaultLimitedServiceNgranNoEmcWhenSimNotReady() throws Exception {
+ createSelector(SLOT_0_SUB_ID);
+ unsolBarringInfoChanged(false);
+ doReturn(TelephonyManager.SIM_STATE_PIN_REQUIRED)
+ .when(mTelephonyManager).getSimState(anyInt());
+
+ EmergencyRegistrationResult regResult = getEmergencyRegResult(NGRAN,
+ REGISTRATION_STATE_UNKNOWN,
+ 0, false, false, 0, 0, "", "", "us");
+ SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+ mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+ processAllMessages();
+
+ bindImsServiceUnregistered();
+
+ verifyScanPsPreferred();
+ }
+
+ @Test
+ public void testNrSaOnlyLimitedServiceNgranEmcNoCountryIsoWhenSimNotReady() throws Exception {
+ createSelector(SLOT_0_SUB_ID);
+ unsolBarringInfoChanged(false);
+ doReturn(TelephonyManager.SIM_STATE_PIN_REQUIRED)
+ .when(mTelephonyManager).getSimState(anyInt());
+
+ EmergencyRegistrationResult regResult = getEmergencyRegResult(NGRAN,
+ REGISTRATION_STATE_UNKNOWN,
+ 0, false, false, 1, 0, "", "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();