summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Android Build Coastguard Worker <android-build-coastguard-worker@google.com> 2025-03-21 20:19:29 -0700
committer Android Build Coastguard Worker <android-build-coastguard-worker@google.com> 2025-03-21 20:19:29 -0700
commit818ee5bc1be356aed9607c55b8ad4a235e901ce2 (patch)
tree08707ce6aecc2355d0355c9b92f9657f5b14650a
parenta42125a4b66a7590d3d420bb7135cf9331c24164 (diff)
parentde83bcf1305f7597c1a6d50a2356bc394e7fc7f6 (diff)
Snap for 13256841 from de83bcf1305f7597c1a6d50a2356bc394e7fc7f6 to 25Q2-release
Change-Id: I2997e731db4f6fe31b09e7864b8b3840284b546c
-rw-r--r--src/java/com/android/internal/telephony/emergency/EmergencyStateTracker.java97
-rw-r--r--src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java29
-rw-r--r--src/java/com/android/internal/telephony/satellite/SatelliteController.java33
-rw-r--r--src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java8
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyStateTrackerTest.java108
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java22
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java3
7 files changed, 259 insertions, 41 deletions
diff --git a/src/java/com/android/internal/telephony/emergency/EmergencyStateTracker.java b/src/java/com/android/internal/telephony/emergency/EmergencyStateTracker.java
index ee00e45dca..4a3ab21c55 100644
--- a/src/java/com/android/internal/telephony/emergency/EmergencyStateTracker.java
+++ b/src/java/com/android/internal/telephony/emergency/EmergencyStateTracker.java
@@ -74,6 +74,8 @@ import com.android.internal.telephony.data.PhoneSwitcher;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.imsphone.ImsPhoneConnection;
import com.android.internal.telephony.satellite.SatelliteController;
+import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.telephony.Rlog;
import java.lang.annotation.Retention;
@@ -141,6 +143,8 @@ public class EmergencyStateTracker {
private final Handler mHandler;
private final boolean mIsSuplDdsSwitchRequiredForEmergencyCall;
private final int mWaitForInServiceTimeoutMs;
+ private final boolean mTurnOffOemEnabledSatelliteDuringEmergencyCall;
+ private final boolean mTurnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall;
private final PowerManager.WakeLock mWakeLock;
private RadioOnHelper mRadioOnHelper;
@EmergencyConstants.EmergencyMode
@@ -488,13 +492,24 @@ public class EmergencyStateTracker {
* @param context The context of the application.
* @param isSuplDdsSwitchRequiredForEmergencyCall Whether gnss supl requires default data for
* emergency call.
+ * @param turnOffOemEnabledSatelliteDuringEmergencyCall Specifying whether OEM enabled satellite
+ * should be turned off during emergency
+ * call.
+ * @param turnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall Specifying whether non-emergency
+ * NB-IOT NTN satellite should be
+ * turned off for emergency call.
* @param featureFlags The telephony feature flags.
*/
public static void make(Context context, boolean isSuplDdsSwitchRequiredForEmergencyCall,
- int waitForInServiceTimeout, @NonNull FeatureFlags featureFlags) {
+ int waitForInServiceTimeout, boolean turnOffOemEnabledSatelliteDuringEmergencyCall,
+ boolean turnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall,
+ @NonNull FeatureFlags featureFlags) {
if (INSTANCE == null) {
INSTANCE = new EmergencyStateTracker(context, Looper.myLooper(),
- isSuplDdsSwitchRequiredForEmergencyCall, waitForInServiceTimeout, featureFlags);
+ isSuplDdsSwitchRequiredForEmergencyCall, waitForInServiceTimeout,
+ turnOffOemEnabledSatelliteDuringEmergencyCall,
+ turnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall,
+ featureFlags);
}
}
@@ -515,12 +530,18 @@ public class EmergencyStateTracker {
*/
private EmergencyStateTracker(Context context, Looper looper,
boolean isSuplDdsSwitchRequiredForEmergencyCall, int waitForInServiceTimeout,
+ boolean turnOffOemEnabledSatelliteDuringEmergencyCall,
+ boolean turnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall,
@NonNull FeatureFlags featureFlags) {
mEcmExitTimeoutMs = DEFAULT_ECM_EXIT_TIMEOUT_MS;
mContext = context;
mHandler = new MyHandler(looper);
mIsSuplDdsSwitchRequiredForEmergencyCall = isSuplDdsSwitchRequiredForEmergencyCall;
mWaitForInServiceTimeoutMs = waitForInServiceTimeout;
+ mTurnOffOemEnabledSatelliteDuringEmergencyCall =
+ turnOffOemEnabledSatelliteDuringEmergencyCall;
+ mTurnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall =
+ turnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall;
mFeatureFlags = featureFlags;
PowerManager pm = context.getSystemService(PowerManager.class);
mWakeLock = (pm != null) ? pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
@@ -557,6 +578,12 @@ public class EmergencyStateTracker {
* modem to get in-service state when emergency
* call is dialed in airplane mode before
* starting the emergency call.
+ * @param turnOffOemEnabledSatelliteDuringEmergencyCall Specifying whether OEM enabled satellite
+ * should be turned off during emergency
+ * call.
+ * @param turnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall Specifying whether non-emergency
+ * NB-IOT NTN satellite should be
+ * turned off for emergency call.
* @param phoneFactoryProxy The {@link PhoneFactoryProxy} to be injected.
* @param phoneSwitcherProxy The {@link PhoneSwitcherProxy} to be injected.
* @param telephonyManagerProxy The {@link TelephonyManagerProxy} to be
@@ -567,6 +594,8 @@ public class EmergencyStateTracker {
@VisibleForTesting
public EmergencyStateTracker(Context context, Looper looper,
boolean isSuplDdsSwitchRequiredForEmergencyCall, int waitForInServiceTimeout,
+ boolean turnOffOemEnabledSatelliteDuringEmergencyCall,
+ boolean turnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall,
PhoneFactoryProxy phoneFactoryProxy, PhoneSwitcherProxy phoneSwitcherProxy,
TelephonyManagerProxy telephonyManagerProxy, RadioOnHelper radioOnHelper,
long ecmExitTimeoutMs, FeatureFlags featureFlags) {
@@ -574,6 +603,10 @@ public class EmergencyStateTracker {
mHandler = new MyHandler(looper);
mIsSuplDdsSwitchRequiredForEmergencyCall = isSuplDdsSwitchRequiredForEmergencyCall;
mWaitForInServiceTimeoutMs = waitForInServiceTimeout;
+ mTurnOffOemEnabledSatelliteDuringEmergencyCall =
+ turnOffOemEnabledSatelliteDuringEmergencyCall;
+ mTurnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall =
+ turnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall;
mPhoneFactoryProxy = phoneFactoryProxy;
mPhoneSwitcherProxy = phoneSwitcherProxy;
mTelephonyManagerProxy = telephonyManagerProxy;
@@ -1732,8 +1765,7 @@ public class EmergencyStateTracker {
boolean isTestEmergencyNumber) {
final boolean isAirplaneModeOn = isAirplaneModeOn(mContext);
boolean needToTurnOnRadio = !isRadioOn() || isAirplaneModeOn;
- final SatelliteController satelliteController = SatelliteController.getInstance();
- boolean needToTurnOffSatellite = satelliteController.isSatelliteEnabledOrBeingEnabled();
+ boolean needToTurnOffSatellite = shouldExitSatelliteMode();
if (isAirplaneModeOn && !isPowerOff()
&& !phone.getServiceStateTracker().getDesiredPowerState()) {
@@ -1769,7 +1801,7 @@ public class EmergencyStateTracker {
return;
}
if (!isRadioReady) {
- if (satelliteController.isSatelliteEnabledOrBeingEnabled()) {
+ if (shouldExitSatelliteMode()) {
// Could not turn satellite off
Rlog.e(TAG, "Failed to turn off satellite modem.");
completeEmergencyMode(emergencyType, DisconnectCause.SATELLITE_ENABLED);
@@ -1802,7 +1834,7 @@ public class EmergencyStateTracker {
return false;
}
return phone.getServiceStateTracker().isRadioOn()
- && !satelliteController.isSatelliteEnabledOrBeingEnabled();
+ && !shouldExitSatelliteMode();
}
@Override
@@ -1814,7 +1846,7 @@ public class EmergencyStateTracker {
}
// onTimeout shall be called only with the Phone for emergency
return phone.getServiceStateTracker().isRadioOn()
- && !satelliteController.isSatelliteEnabledOrBeingEnabled();
+ && !shouldExitSatelliteMode();
}
}, !isTestEmergencyNumber, phone, isTestEmergencyNumber, waitForInServiceTimeout);
} else {
@@ -2324,4 +2356,55 @@ public class EmergencyStateTracker {
return false;
}
+
+ /**
+ * Checks whether the satellite mode should be turned off to proceed with an emergency call
+ * when satellite mode is enabled or an NTN(Non Terrestrial Network) session is in progress.
+ *
+ * @return {@code true} if satellite mode should be exited before an emergency call is being
+ * processed, {@code false} otherwise.
+ */
+ @VisibleForTesting
+ public boolean shouldExitSatelliteMode() {
+ final SatelliteController satelliteController = SatelliteController.getInstance();
+
+ if (!satelliteController.isSatelliteEnabledOrBeingEnabled()) {
+ return false;
+ }
+
+ if (!mTurnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall) {
+ // Carrier
+ return false;
+ }
+
+ if (satelliteController.isDemoModeEnabled()) {
+ // If user makes emergency call in demo mode, end the satellite session
+ return true;
+ } else if (mFeatureFlags.carrierRoamingNbIotNtn()
+ && !satelliteController.getRequestIsEmergency()) {
+ // If satellite is not for emergency, end the satellite session
+ return true;
+ } else { // satellite is for emergency
+ if (mFeatureFlags.carrierRoamingNbIotNtn()) {
+ int subId = satelliteController.getSelectedSatelliteSubId();
+ SubscriptionInfoInternal info = SubscriptionManagerService.getInstance()
+ .getSubscriptionInfoInternal(subId);
+ if (info == null) {
+ Rlog.e(TAG, "satellite is/being enabled, but satellite sub "
+ + subId + " is null");
+ return false;
+ }
+
+ if (info.getOnlyNonTerrestrialNetwork() == 1) {
+ // OEM
+ return mTurnOffOemEnabledSatelliteDuringEmergencyCall;
+ } else {
+ // Carrier
+ return satelliteController.shouldTurnOffCarrierSatelliteForEmergencyCall();
+ }
+ } else {
+ return mTurnOffOemEnabledSatelliteDuringEmergencyCall;
+ }
+ }
+ }
}
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
index 57b0b3f51f..f4475b55bd 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
@@ -259,6 +259,8 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
private Optional<Integer> mCurrentlyConnectedSubId = Optional.empty();
private final MmTelFeatureListener mMmTelFeatureListener = new MmTelFeatureListener();
+ private com.android.server.telecom.flags.FeatureFlags mTelecomFlags =
+ new com.android.server.telecom.flags.FeatureFlagsImpl();
private class MmTelFeatureListener extends MmTelFeature.Listener {
private IImsCallSessionListener processIncomingCall(@NonNull IImsCallSession c,
@@ -312,11 +314,8 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
// activeCall could be null if the foreground call is in a disconnected
// state. If either of the calls is null there is no need to check if
// one will be disconnected on answer.
- // Use VideoProfile.STATE_BIDIRECTIONAL to not affect existing
- // implementation. Video state of user response is handled in acceptCall().
boolean answeringWillDisconnect =
- shouldDisconnectActiveCallOnAnswer(activeCall, imsCall,
- VideoProfile.STATE_BIDIRECTIONAL);
+ shouldDisconnectActiveCallOnAnswer(activeCall, imsCall);
conn.setActiveCallDisconnectedOnAnswer(answeringWillDisconnect);
}
}
@@ -2223,7 +2222,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
ImsCall ringingCall = mRingingCall.getImsCall();
if (mForegroundCall.hasConnections() && mRingingCall.hasConnections()) {
answeringWillDisconnect =
- shouldDisconnectActiveCallOnAnswer(activeCall, ringingCall, videoState);
+ shouldDisconnectActiveCallOnAnswer(activeCall, ringingCall);
}
// Cache video state for pending MT call.
@@ -4086,6 +4085,13 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
+ " in the single call unhold case");
}
}
+ ImsPhoneConnection conn = findConnection(imsCall);
+ // Send connection event so that Telecom can unhold the call the bg call that was held
+ // for calls across phone accounts.
+ if (mTelecomFlags.enableCallSequencing() && conn != null
+ && conn.getState() != ImsPhoneCall.State.DISCONNECTED) {
+ conn.onConnectionEvent(android.telecom.Connection.EVENT_CALL_RESUME_FAILED, null);
+ }
mPhone.notifySuppServiceFailed(Phone.SuppService.RESUME);
mMetrics.writeOnImsCallResumeFailed(mPhone.getPhoneId(), imsCall.getCallSession(),
reasonInfo);
@@ -5535,13 +5541,11 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
*
* @param activeCall The active call.
* @param incomingCall The incoming call.
- * @param incomingCallVideoState The media type of incoming call acceptance.
- * {@link VideoProfile.VideoState}
* @return {@code true} if answering the incoming call will cause the active call to be
* disconnected, {@code false} otherwise.
*/
private boolean shouldDisconnectActiveCallOnAnswer(ImsCall activeCall,
- ImsCall incomingCall, int incomingCallVideoState) {
+ ImsCall incomingCall) {
if (activeCall == null || incomingCall == null) {
return false;
@@ -5556,14 +5560,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
boolean isActiveCallOnWifi = activeCall.isWifiCall();
boolean isVoWifiEnabled = mImsManager.isWfcEnabledByPlatform()
&& mImsManager.isWfcEnabledByUser();
- boolean isIncomingCallAudio = true;
- if (!mFeatureFlags.terminateActiveVideoCallWhenAcceptingSecondVideoCallAsAudioOnly()) {
- isIncomingCallAudio = !incomingCall.isVideoCall();
- } else {
- isIncomingCallAudio = !incomingCall.isVideoCall()
- || incomingCallVideoState == VideoProfile.STATE_AUDIO_ONLY;
- }
-
+ boolean isIncomingCallAudio = !incomingCall.isVideoCall();
log("shouldDisconnectActiveCallOnAnswer : isActiveCallVideo=" + isActiveCallVideo +
" isActiveCallOnWifi=" + isActiveCallOnWifi + " isIncomingCallAudio=" +
isIncomingCallAudio + " isVowifiEnabled=" + isVoWifiEnabled);
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index 0d6a2250a7..672a064549 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -9195,23 +9195,42 @@ public class SatelliteController extends Handler {
* @return Supported modes {@link CarrierConfigManager.SATELLITE_DATA_SUPPORT_MODE}
*/
public int getSatelliteDataServicePolicyForPlmn(int subId, String plmn) {
- if (plmn != null && isValidSubscriptionId(subId)) {
+ plogd("getSatelliteDataServicePolicyForPlmn: subId=" + subId + " plmn=" + plmn);
+ if (isValidSubscriptionId(subId)) {
+ Map<String, Integer> dataServicePolicy;
synchronized (mSupportedSatelliteServicesLock) {
- Map<String, Integer> dataServicePolicy =
- mEntitlementDataServicePolicyMapPerCarrier.get(
- subId);
- logd("data policy available for sub id:" + dataServicePolicy);
- if (dataServicePolicy != null && dataServicePolicy.containsKey(plmn)
- && !plmn.isEmpty()) {
+ dataServicePolicy = mEntitlementDataServicePolicyMapPerCarrier.get(subId);
+ }
+ plogd("getSatelliteDataServicePolicyForPlmn: dataServicePolicy=" + dataServicePolicy);
+
+ if (dataServicePolicy != null) {
+ if (!TextUtils.isEmpty(plmn) && dataServicePolicy.containsKey(plmn)) {
+ plogd("getSatelliteDataServicePolicyForPlmn: "
+ + "return policy using dataServicePolicy map");
return dataServicePolicy.get(plmn);
+ } else if (TextUtils.isEmpty(plmn)) {
+ int preferredPolicy =
+ CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED;
+ for (String plmnKey : dataServicePolicy.keySet()) {
+ int policy = dataServicePolicy.get(plmnKey);
+ // higher value has higher preference
+ if (policy > preferredPolicy) {
+ preferredPolicy = policy;
+ }
+ }
+ plogd("getSatelliteDataServicePolicyForPlmn: "
+ + "return preferredPolicy=" + preferredPolicy);
+ return preferredPolicy;
}
}
if (isSatelliteDataServicesAllowed(subId, plmn)) {
+ plogd("getSatelliteDataServicePolicyForPlmn: return data support mode from config");
return getCarrierSatelliteDataSupportedModeFromConfig(subId);
}
}
+ plogd("getSatelliteDataServicePolicyForPlmn: return data support only restricted");
return CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED;
}
diff --git a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
index 026bfff056..bedc20e9d5 100644
--- a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
+++ b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
@@ -3919,12 +3919,10 @@ public class SubscriptionManagerService extends ISub.Stub {
case SubscriptionManager.PHONE_NUMBER_SOURCE_UICC:
final Phone phone = PhoneFactory.getPhone(getSlotIndex(subId));
if (phone != null) {
- String number = phone.getLine1Number();
- if (!TextUtils.isEmpty(number)) {
- return number;
- }
+ return TextUtils.emptyIfNull(phone.getLine1Number());
+ } else {
+ return subInfo.getNumber();
}
- return subInfo.getNumber();
case SubscriptionManager.PHONE_NUMBER_SOURCE_CARRIER:
return subInfo.getNumberFromCarrier();
case SubscriptionManager.PHONE_NUMBER_SOURCE_IMS:
diff --git a/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyStateTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyStateTrackerTest.java
index 2909966b2b..d50e781f2c 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyStateTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyStateTrackerTest.java
@@ -84,6 +84,7 @@ import com.android.internal.telephony.RILConstants;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.data.PhoneSwitcher;
+import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
import org.junit.After;
import org.junit.Before;
@@ -91,6 +92,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
+import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
@@ -149,8 +151,10 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
EmergencyStateTracker.getInstance();
});
- EmergencyStateTracker
- .make(mContext, true, TEST_WAIT_FOR_IN_SERVICE_TIMEOUT_MS, mFeatureFlags);
+ EmergencyStateTracker.make(mContext, true, TEST_WAIT_FOR_IN_SERVICE_TIMEOUT_MS,
+ true, /* turnOffOemEnabledSatelliteDuringEmergencyCall */
+ true, /* turnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall */
+ mFeatureFlags);
assertNotNull(EmergencyStateTracker.getInstance());
}
@@ -158,8 +162,10 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
@Test
@SmallTest
public void getInstance_returnsSameInstance() {
- EmergencyStateTracker
- .make(mContext, true, TEST_WAIT_FOR_IN_SERVICE_TIMEOUT_MS, mFeatureFlags);
+ EmergencyStateTracker.make(mContext, true, TEST_WAIT_FOR_IN_SERVICE_TIMEOUT_MS,
+ true, /* turnOffOemEnabledSatelliteDuringEmergencyCall */
+ true, /* turnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall */
+ mFeatureFlags);
EmergencyStateTracker instance1 = EmergencyStateTracker.getInstance();
EmergencyStateTracker instance2 = EmergencyStateTracker.getInstance();
@@ -3300,6 +3306,91 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
anyBoolean(), eq(0));
}
+ @Test
+ @SmallTest
+ public void testShouldExitSatelliteModeWhenSatelliteModeNotEnabled() {
+ // Satellite mode is not enabled.
+ doReturn(false).when(mSatelliteController).isSatelliteEnabledOrBeingEnabled();
+ EmergencyStateTracker emergencyStateTracker = setupEmergencyStateTracker(true);
+
+ assertFalse(emergencyStateTracker.shouldExitSatelliteMode());
+ }
+
+ @Test
+ @SmallTest
+ public void testShouldExitSatelliteModeWhenConfigTurnOffNonEmergencyNbIotNtnSessionDisabled() {
+ doReturn(true).when(mSatelliteController).isSatelliteEnabledOrBeingEnabled();
+ // Config for turning off non-emergency NB-IOT NTN session for emergency call: false
+ EmergencyStateTracker emergencyStateTracker = setupEmergencyStateTracker(true, true, false);
+
+ assertFalse(emergencyStateTracker.shouldExitSatelliteMode());
+ }
+
+ @Test
+ @SmallTest
+ public void testShouldExitSatelliteModeWhenSatelliteDemoModeEnabled() {
+ doReturn(true).when(mSatelliteController).isSatelliteEnabledOrBeingEnabled();
+ // Satellite demo mode is enabled
+ doReturn(true).when(mSatelliteController).isDemoModeEnabled();
+ EmergencyStateTracker emergencyStateTracker = setupEmergencyStateTracker(true, true, true);
+
+ assertTrue(emergencyStateTracker.shouldExitSatelliteMode());
+ }
+
+ @Test
+ @SmallTest
+ public void testShouldExitSatelliteModeWhenCarrierRoamingNbIotNtnEnabledAndNtnNonEmergency() {
+ // carrierRoamingNbIotNtn feature enabled
+ when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
+ doReturn(true).when(mSatelliteController).isSatelliteEnabledOrBeingEnabled();
+ doReturn(false).when(mSatelliteController).isDemoModeEnabled();
+ // NTN non-emergency session is in progress
+ doReturn(false).when(mSatelliteController).getRequestIsEmergency();
+
+ EmergencyStateTracker emergencyStateTracker = setupEmergencyStateTracker(true, true, true);
+
+ assertTrue(emergencyStateTracker.shouldExitSatelliteMode());
+ }
+
+ @Test
+ @SmallTest
+ public void testShouldExitSatelliteModeWhenNtnEmergency() {
+ // carrierRoamingNbIotNtn feature enabled
+ when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
+ doReturn(true).when(mSatelliteController).isSatelliteEnabledOrBeingEnabled();
+ doReturn(false).when(mSatelliteController).isDemoModeEnabled();
+ doReturn(true).when(mSatelliteController).getRequestIsEmergency();
+ doReturn(null).when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt());
+
+ boolean turnOffOemEnabledSatelliteDuringEmergencyCall = true;
+ EmergencyStateTracker emergencyStateTracker = setupEmergencyStateTracker(
+ true, turnOffOemEnabledSatelliteDuringEmergencyCall, true);
+
+ // No valid subscription
+ assertFalse(emergencyStateTracker.shouldExitSatelliteMode());
+
+ SubscriptionInfoInternal subInfo = Mockito.mock(SubscriptionInfoInternal.class);
+ doReturn(1).when(subInfo).getOnlyNonTerrestrialNetwork();
+ doReturn(subInfo).when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt());
+
+ // Only non-terrestrial networks
+ assertEquals(turnOffOemEnabledSatelliteDuringEmergencyCall,
+ emergencyStateTracker.shouldExitSatelliteMode());
+
+ doReturn(0).when(subInfo).getOnlyNonTerrestrialNetwork();
+
+ // Not only non-terrestrial networks
+ emergencyStateTracker.shouldExitSatelliteMode();
+
+ verify(mSatelliteController).shouldTurnOffCarrierSatelliteForEmergencyCall();
+
+ // carrierRoamingNbIotNtn feature disabled
+ when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(false);
+
+ assertEquals(turnOffOemEnabledSatelliteDuringEmergencyCall,
+ emergencyStateTracker.shouldExitSatelliteMode());
+ }
+
/**
* Test Phone selection.
* SIM absent and SIM ready on the other Phone.
@@ -3571,11 +3662,20 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
private EmergencyStateTracker setupEmergencyStateTracker(
boolean isSuplDdsSwitchRequiredForEmergencyCall) {
+ return setupEmergencyStateTracker(isSuplDdsSwitchRequiredForEmergencyCall, true, true);
+ }
+
+ private EmergencyStateTracker setupEmergencyStateTracker(
+ boolean isSuplDdsSwitchRequiredForEmergencyCall,
+ boolean turnOffOemEnabledSatelliteDuringEmergencyCall,
+ boolean turnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall) {
doReturn(mPhoneSwitcher).when(mPhoneSwitcherProxy).getPhoneSwitcher();
doNothing().when(mPhoneSwitcher).overrideDefaultDataForEmergency(
anyInt(), anyInt(), any());
return new EmergencyStateTracker(mContext, mTestableLooper.getLooper(),
isSuplDdsSwitchRequiredForEmergencyCall, TEST_WAIT_FOR_IN_SERVICE_TIMEOUT_MS,
+ turnOffOemEnabledSatelliteDuringEmergencyCall,
+ turnOffNonEmergencyNbIotNtnSatelliteForEmergencyCall,
mPhoneFactoryProxy, mPhoneSwitcherProxy, mTelephonyManagerProxy, mRadioOnHelper,
TEST_ECM_EXIT_TIMEOUT_MS, mFeatureFlags);
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
index bc50894257..a519067e78 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
@@ -6593,6 +6593,13 @@ public class SatelliteControllerTest extends TelephonyTest {
.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00102");
assertEquals(SATELLITE_DATA_SUPPORT_ALL, dataSupportModeForPlmn);
+ dataSupportModeForPlmn = mSatelliteControllerUT
+ .getSatelliteDataServicePolicyForPlmn(SUB_ID, "");
+ assertEquals(SATELLITE_DATA_SUPPORT_ALL, dataSupportModeForPlmn);
+
+ dataSupportModeForPlmn = mSatelliteControllerUT
+ .getSatelliteDataServicePolicyForPlmn(SUB_ID, null);
+ assertEquals(SATELLITE_DATA_SUPPORT_ALL, dataSupportModeForPlmn);
}
@Test
@@ -6626,6 +6633,14 @@ public class SatelliteControllerTest extends TelephonyTest {
.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101");
assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn);
+ dataSupportModeForPlmn = mSatelliteControllerUT
+ .getSatelliteDataServicePolicyForPlmn(SUB_ID, "");
+ assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn);
+
+ dataSupportModeForPlmn = mSatelliteControllerUT
+ .getSatelliteDataServicePolicyForPlmn(SUB_ID, null);
+ assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn);
+
setConfigData(new ArrayList<>());
PersistableBundle carrierSupportedSatelliteServicesPerProvider =
new PersistableBundle();
@@ -6642,6 +6657,13 @@ public class SatelliteControllerTest extends TelephonyTest {
.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101");
assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn);
+ dataSupportModeForPlmn = mSatelliteControllerUT
+ .getSatelliteDataServicePolicyForPlmn(SUB_ID, "");
+ assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn);
+
+ dataSupportModeForPlmn = mSatelliteControllerUT
+ .getSatelliteDataServicePolicyForPlmn(SUB_ID, null);
+ assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn);
}
@Test
diff --git a/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java b/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java
index 636aaba814..492b94ea25 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java
@@ -107,7 +107,6 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.ArraySet;
import android.util.Base64;
-import android.util.Log;
import com.android.internal.R;
import com.android.internal.telephony.ContextFixture;
@@ -2579,7 +2578,7 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
// If getLine1Number is empty, then the number should be from the sub info.
assertThat(mSubscriptionManagerServiceUT.getPhoneNumber(1,
SubscriptionManager.PHONE_NUMBER_SOURCE_UICC, CALLING_PACKAGE, CALLING_FEATURE))
- .isEqualTo(FAKE_PHONE_NUMBER2);
+ .isEqualTo("");
}
@Test