Loading src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java +13 −6 Original line number Diff line number Diff line Loading @@ -307,7 +307,7 @@ public class SatelliteSOSMessageRecommender extends Handler { private void handleSatelliteProvisionStateChangedEvent(boolean provisioned) { if (!provisioned && !isSatelliteConnectedViaCarrierWithinHysteresisTime()) { && !isSatelliteEmergencyMessagingViaCarrierAvailable()) { cleanUpResources(false); } } Loading Loading @@ -347,7 +347,7 @@ public class SatelliteSOSMessageRecommender extends Handler { if (!isCellularAvailable && isSatelliteAllowed() && ((isDeviceProvisioned() && isSatelliteAllowedByReasons()) || isSatelliteConnectedViaCarrierWithinHysteresisTime()) || isSatelliteEmergencyMessagingViaCarrierAvailable()) && shouldTrackCall(mEmergencyConnection.getState())) { plogd("handleTimeoutEvent: Sent EVENT_DISPLAY_EMERGENCY_MESSAGE to Dialer"); Bundle extras = createExtraBundleForEventDisplayEmergencyMessage( Loading @@ -367,7 +367,7 @@ public class SatelliteSOSMessageRecommender extends Handler { private boolean isSatelliteAllowed() { synchronized (mLock) { if (isSatelliteConnectedViaCarrierWithinHysteresisTime()) return true; if (isSatelliteEmergencyMessagingViaCarrierAvailable()) return true; return mIsSatelliteAllowedForCurrentLocation; } } Loading @@ -388,7 +388,12 @@ public class SatelliteSOSMessageRecommender extends Handler { return satelliteProvisioned != null ? satelliteProvisioned : false; } private boolean isSatelliteConnectedViaCarrierWithinHysteresisTime() { private boolean isSatelliteEmergencyMessagingViaCarrierAvailable() { if (!mSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier()) { plogd("isSatelliteEmergencyMessagingViaCarrierAvailable: false, " + "device does not support satellite emergency messaging via carrier"); return false; } return mIsSatelliteConnectedViaCarrierWithinHysteresisTime.get(); } Loading Loading @@ -567,7 +572,7 @@ public class SatelliteSOSMessageRecommender extends Handler { } private void selectEmergencyCallWaitForConnectionTimeoutDuration() { if (isSatelliteConnectedViaCarrierWithinHysteresisTime()) { if (isSatelliteEmergencyMessagingViaCarrierAvailable()) { int satelliteSubId = mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime.get(); mTimeoutMillis = mSatelliteController.getCarrierEmergencyCallWaitForConnectionTimeoutMillis( Loading Loading @@ -769,7 +774,7 @@ public class SatelliteSOSMessageRecommender extends Handler { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public int getEmergencyCallToSatelliteHandoverType() { if (isSatelliteConnectedViaCarrierWithinHysteresisTime()) { if (isSatelliteEmergencyMessagingViaCarrierAvailable()) { int satelliteSubId = mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime.get(); return mSatelliteController.getCarrierRoamingNtnEmergencyCallToSatelliteHandoverType( satelliteSubId); Loading Loading @@ -841,6 +846,8 @@ public class SatelliteSOSMessageRecommender extends Handler { private void updateSatelliteConnectedViaCarrierWithinHysteresisTimeState() { Pair<Boolean, Integer> satelliteConnectedState = mSatelliteController.isSatelliteConnectedViaCarrierWithinHysteresisTime(); plogd("updateSatelliteConnectedViaCarrierWithinHysteresisTimeState: subId=" + satelliteConnectedState.second + ", connected="+ satelliteConnectedState.first); mIsSatelliteConnectedViaCarrierWithinHysteresisTime.set(satelliteConnectedState.first); if (satelliteConnectedState.first) { mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime.set( Loading tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommenderTest.java +67 −0 Original line number Diff line number Diff line Loading @@ -331,6 +331,43 @@ public class SatelliteSOSMessageRecommenderTest extends TelephonyTest { assertFalse(mTestSOSMessageRecommender.isDialerNotified()); } @Test public void testTimeoutBeforeEmergencyCallEnd_EventDisplayEmergencyMessageNotSent_Test2() { /* * This test is to test the case where the device is provisioned, supports satellite * via OEM, and is connected via carrier within the hysteresis time. However, satellite * is not allowed at current location and emergency messaing via carrier is not supported. * In this case, the EVENT_DISPLAY_EMERGENCY_MESSAGE should not be sent. */ mTestSatelliteController.setSatelliteConnectedViaCarrierWithinHysteresisTime(true, SUB_ID1); mTestSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier = false; mTestSatelliteController.isOemEnabledSatelliteSupported = true; mTestSatelliteController.setDeviceProvisioned(true); mTestSOSMessageRecommender.isSatelliteAllowedCallback = null; mTestSOSMessageRecommender.onEmergencyCallStarted(mTestConnection, false); processAllMessages(); assertEquals(1, mTestSOSMessageRecommender.getCountOfTimerStarted()); assertRegisterForStateChangedEventsTriggered(mPhone, 1, 1); assertRegisterForStateChangedEventsTriggered(mPhone2, 1, 1); assertNull(mTestSOSMessageRecommender.isSatelliteAllowedCallback); // Move Location service to emergency mode mTestSOSMessageRecommender.onEmergencyCallConnectionStateChanged( mTestConnection.getTelecomCallId(), Connection.STATE_DIALING); processAllMessages(); assertNotNull(mTestSOSMessageRecommender.isSatelliteAllowedCallback); // Wait for the timeout to expires mTestSOSMessageRecommender.isSatelliteAllowedCallback.onResult(false); moveTimeForward(TEST_EMERGENCY_CALL_TO_SOS_MSG_HYSTERESIS_TIMEOUT_MILLIS); processAllMessages(); assertFalse(mTestConnection.isEventSent(TelephonyManager.EVENT_DISPLAY_EMERGENCY_MESSAGE)); assertUnregisterForStateChangedEventsTriggered(mPhone, 1, 1); assertUnregisterForStateChangedEventsTriggered(mPhone2, 1, 1); verify(mMockSatelliteStats, times(1)).onSatelliteSosMessageRecommender(any()); assertFalse(mTestSOSMessageRecommender.isDialerNotified()); } @Test public void testTimeoutBeforeEmergencyCallEnd_T911_FromNotConnectedToConnected() { mTestSOSMessageRecommender.isSatelliteAllowedCallback = null; Loading Loading @@ -684,6 +721,20 @@ public class SatelliteSOSMessageRecommenderTest extends TelephonyTest { processAllMessages(); assertEquals(carrierTimeoutMillis, mTestSOSMessageRecommender.getTimeOutMillis()); verify(mMockSatelliteStats, never()).onSatelliteSosMessageRecommender(any()); // OEM supports satellite, device is connected to carrier satellite within hysteresis time, // but emergency messaging via carrier is not supported. Thus, OEM timer will be used. mTestSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier = false; mTestSatelliteController.setSatelliteConnectedViaCarrierWithinHysteresisTime(true, SUB_ID1); subscriptionInfo = new SubscriptionInfo.Builder() .setId(SUB_ID1).setOnlyNonTerrestrialNetwork(true).build(); when(mMockSubscriptionManagerService.getSubscriptionInfo(eq(SUB_ID1))) .thenReturn(subscriptionInfo); mTestSOSMessageRecommender.onEmergencyCallStarted(mTestConnection, false); processAllMessages(); assertEquals(TEST_EMERGENCY_CALL_TO_SOS_MSG_HYSTERESIS_TIMEOUT_MILLIS, mTestSOSMessageRecommender.getTimeOutMillis()); verify(mMockSatelliteStats, never()).onSatelliteSosMessageRecommender(any()); } @Test Loading Loading @@ -716,6 +767,22 @@ public class SatelliteSOSMessageRecommenderTest extends TelephonyTest { mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN); } @Test public void testGetEmergencyCallToSatelliteHandoverType_OnlySatelliteViaOemAvailable() { mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN); mTestSatelliteController.setSatelliteConnectedViaCarrierWithinHysteresisTime(true, SUB_ID1); mTestSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier = false; mTestSatelliteController.isOemEnabledSatelliteSupported = true; mTestSatelliteController.setDeviceProvisioned(true); mTestSOSMessageRecommender.onEmergencyCallStarted(mTestConnection, false); assertEquals(EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_SOS, mTestSOSMessageRecommender.getEmergencyCallToSatelliteHandoverType()); verify(mMockSatelliteStats, never()).onSatelliteSosMessageRecommender(any()); mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN); } @Test public void testGetEmergencyCallToSatelliteHandoverType_OemAndCarrierNotAvailable() { mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN); Loading Loading
src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java +13 −6 Original line number Diff line number Diff line Loading @@ -307,7 +307,7 @@ public class SatelliteSOSMessageRecommender extends Handler { private void handleSatelliteProvisionStateChangedEvent(boolean provisioned) { if (!provisioned && !isSatelliteConnectedViaCarrierWithinHysteresisTime()) { && !isSatelliteEmergencyMessagingViaCarrierAvailable()) { cleanUpResources(false); } } Loading Loading @@ -347,7 +347,7 @@ public class SatelliteSOSMessageRecommender extends Handler { if (!isCellularAvailable && isSatelliteAllowed() && ((isDeviceProvisioned() && isSatelliteAllowedByReasons()) || isSatelliteConnectedViaCarrierWithinHysteresisTime()) || isSatelliteEmergencyMessagingViaCarrierAvailable()) && shouldTrackCall(mEmergencyConnection.getState())) { plogd("handleTimeoutEvent: Sent EVENT_DISPLAY_EMERGENCY_MESSAGE to Dialer"); Bundle extras = createExtraBundleForEventDisplayEmergencyMessage( Loading @@ -367,7 +367,7 @@ public class SatelliteSOSMessageRecommender extends Handler { private boolean isSatelliteAllowed() { synchronized (mLock) { if (isSatelliteConnectedViaCarrierWithinHysteresisTime()) return true; if (isSatelliteEmergencyMessagingViaCarrierAvailable()) return true; return mIsSatelliteAllowedForCurrentLocation; } } Loading @@ -388,7 +388,12 @@ public class SatelliteSOSMessageRecommender extends Handler { return satelliteProvisioned != null ? satelliteProvisioned : false; } private boolean isSatelliteConnectedViaCarrierWithinHysteresisTime() { private boolean isSatelliteEmergencyMessagingViaCarrierAvailable() { if (!mSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier()) { plogd("isSatelliteEmergencyMessagingViaCarrierAvailable: false, " + "device does not support satellite emergency messaging via carrier"); return false; } return mIsSatelliteConnectedViaCarrierWithinHysteresisTime.get(); } Loading Loading @@ -567,7 +572,7 @@ public class SatelliteSOSMessageRecommender extends Handler { } private void selectEmergencyCallWaitForConnectionTimeoutDuration() { if (isSatelliteConnectedViaCarrierWithinHysteresisTime()) { if (isSatelliteEmergencyMessagingViaCarrierAvailable()) { int satelliteSubId = mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime.get(); mTimeoutMillis = mSatelliteController.getCarrierEmergencyCallWaitForConnectionTimeoutMillis( Loading Loading @@ -769,7 +774,7 @@ public class SatelliteSOSMessageRecommender extends Handler { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public int getEmergencyCallToSatelliteHandoverType() { if (isSatelliteConnectedViaCarrierWithinHysteresisTime()) { if (isSatelliteEmergencyMessagingViaCarrierAvailable()) { int satelliteSubId = mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime.get(); return mSatelliteController.getCarrierRoamingNtnEmergencyCallToSatelliteHandoverType( satelliteSubId); Loading Loading @@ -841,6 +846,8 @@ public class SatelliteSOSMessageRecommender extends Handler { private void updateSatelliteConnectedViaCarrierWithinHysteresisTimeState() { Pair<Boolean, Integer> satelliteConnectedState = mSatelliteController.isSatelliteConnectedViaCarrierWithinHysteresisTime(); plogd("updateSatelliteConnectedViaCarrierWithinHysteresisTimeState: subId=" + satelliteConnectedState.second + ", connected="+ satelliteConnectedState.first); mIsSatelliteConnectedViaCarrierWithinHysteresisTime.set(satelliteConnectedState.first); if (satelliteConnectedState.first) { mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime.set( Loading
tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommenderTest.java +67 −0 Original line number Diff line number Diff line Loading @@ -331,6 +331,43 @@ public class SatelliteSOSMessageRecommenderTest extends TelephonyTest { assertFalse(mTestSOSMessageRecommender.isDialerNotified()); } @Test public void testTimeoutBeforeEmergencyCallEnd_EventDisplayEmergencyMessageNotSent_Test2() { /* * This test is to test the case where the device is provisioned, supports satellite * via OEM, and is connected via carrier within the hysteresis time. However, satellite * is not allowed at current location and emergency messaing via carrier is not supported. * In this case, the EVENT_DISPLAY_EMERGENCY_MESSAGE should not be sent. */ mTestSatelliteController.setSatelliteConnectedViaCarrierWithinHysteresisTime(true, SUB_ID1); mTestSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier = false; mTestSatelliteController.isOemEnabledSatelliteSupported = true; mTestSatelliteController.setDeviceProvisioned(true); mTestSOSMessageRecommender.isSatelliteAllowedCallback = null; mTestSOSMessageRecommender.onEmergencyCallStarted(mTestConnection, false); processAllMessages(); assertEquals(1, mTestSOSMessageRecommender.getCountOfTimerStarted()); assertRegisterForStateChangedEventsTriggered(mPhone, 1, 1); assertRegisterForStateChangedEventsTriggered(mPhone2, 1, 1); assertNull(mTestSOSMessageRecommender.isSatelliteAllowedCallback); // Move Location service to emergency mode mTestSOSMessageRecommender.onEmergencyCallConnectionStateChanged( mTestConnection.getTelecomCallId(), Connection.STATE_DIALING); processAllMessages(); assertNotNull(mTestSOSMessageRecommender.isSatelliteAllowedCallback); // Wait for the timeout to expires mTestSOSMessageRecommender.isSatelliteAllowedCallback.onResult(false); moveTimeForward(TEST_EMERGENCY_CALL_TO_SOS_MSG_HYSTERESIS_TIMEOUT_MILLIS); processAllMessages(); assertFalse(mTestConnection.isEventSent(TelephonyManager.EVENT_DISPLAY_EMERGENCY_MESSAGE)); assertUnregisterForStateChangedEventsTriggered(mPhone, 1, 1); assertUnregisterForStateChangedEventsTriggered(mPhone2, 1, 1); verify(mMockSatelliteStats, times(1)).onSatelliteSosMessageRecommender(any()); assertFalse(mTestSOSMessageRecommender.isDialerNotified()); } @Test public void testTimeoutBeforeEmergencyCallEnd_T911_FromNotConnectedToConnected() { mTestSOSMessageRecommender.isSatelliteAllowedCallback = null; Loading Loading @@ -684,6 +721,20 @@ public class SatelliteSOSMessageRecommenderTest extends TelephonyTest { processAllMessages(); assertEquals(carrierTimeoutMillis, mTestSOSMessageRecommender.getTimeOutMillis()); verify(mMockSatelliteStats, never()).onSatelliteSosMessageRecommender(any()); // OEM supports satellite, device is connected to carrier satellite within hysteresis time, // but emergency messaging via carrier is not supported. Thus, OEM timer will be used. mTestSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier = false; mTestSatelliteController.setSatelliteConnectedViaCarrierWithinHysteresisTime(true, SUB_ID1); subscriptionInfo = new SubscriptionInfo.Builder() .setId(SUB_ID1).setOnlyNonTerrestrialNetwork(true).build(); when(mMockSubscriptionManagerService.getSubscriptionInfo(eq(SUB_ID1))) .thenReturn(subscriptionInfo); mTestSOSMessageRecommender.onEmergencyCallStarted(mTestConnection, false); processAllMessages(); assertEquals(TEST_EMERGENCY_CALL_TO_SOS_MSG_HYSTERESIS_TIMEOUT_MILLIS, mTestSOSMessageRecommender.getTimeOutMillis()); verify(mMockSatelliteStats, never()).onSatelliteSosMessageRecommender(any()); } @Test Loading Loading @@ -716,6 +767,22 @@ public class SatelliteSOSMessageRecommenderTest extends TelephonyTest { mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN); } @Test public void testGetEmergencyCallToSatelliteHandoverType_OnlySatelliteViaOemAvailable() { mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN); mTestSatelliteController.setSatelliteConnectedViaCarrierWithinHysteresisTime(true, SUB_ID1); mTestSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier = false; mTestSatelliteController.isOemEnabledSatelliteSupported = true; mTestSatelliteController.setDeviceProvisioned(true); mTestSOSMessageRecommender.onEmergencyCallStarted(mTestConnection, false); assertEquals(EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_SOS, mTestSOSMessageRecommender.getEmergencyCallToSatelliteHandoverType()); verify(mMockSatelliteStats, never()).onSatelliteSosMessageRecommender(any()); mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN); } @Test public void testGetEmergencyCallToSatelliteHandoverType_OemAndCarrierNotAvailable() { mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN); Loading