diff options
author | 2025-03-21 20:19:29 -0700 | |
---|---|---|
committer | 2025-03-21 20:19:29 -0700 | |
commit | 818ee5bc1be356aed9607c55b8ad4a235e901ce2 (patch) | |
tree | 08707ce6aecc2355d0355c9b92f9657f5b14650a | |
parent | a42125a4b66a7590d3d420bb7135cf9331c24164 (diff) | |
parent | de83bcf1305f7597c1a6d50a2356bc394e7fc7f6 (diff) |
Snap for 13256841 from de83bcf1305f7597c1a6d50a2356bc394e7fc7f6 to 25Q2-release
Change-Id: I2997e731db4f6fe31b09e7864b8b3840284b546c
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 |