Loading src/java/com/android/internal/telephony/satellite/SatelliteController.java +98 −22 Original line number Diff line number Diff line Loading @@ -78,6 +78,7 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.NetworkRegistrationInfo; import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; Loading Loading @@ -334,6 +335,14 @@ public class SatelliteController extends Handler { @NonNull private final SparseBooleanArray mWasSatelliteConnectedViaCarrier = new SparseBooleanArray(); /** * Key: Subscription ID; Value: set of * {@link android.telephony.NetworkRegistrationInfo.ServiceType} */ @GuardedBy("mSatelliteConnectedLock") @NonNull private final Map<Integer, List<Integer>> mSatModeCapabilitiesForCarrierRoaming = new HashMap<>(); @GuardedBy("mSatelliteConnectedLock") @NonNull private final SparseBooleanArray mIsSatelliteConnectedViaCarrierHysteresisTimeExpired = new SparseBooleanArray(); Loading Loading @@ -2566,13 +2575,49 @@ public class SatelliteController extends Handler { return true; } for (Phone phone : PhoneFactory.getPhones()) { if (isSatelliteSupportedViaCarrier(phone.getSubId())) { if (isInSatelliteModeForCarrierRoaming(phone)) { logd("isSatelliteConnectedViaCarrierWithinHysteresisTime: " + "subId:" + phone.getSubId() + " is connected to satellite within hysteresis time"); return true; } } return false; } /** * Get whether device is connected to satellite via carrier. * * @param phone phone object * @return {@code true} if the device is connected to satellite using the phone within the * {@link CarrierConfigManager#KEY_SATELLITE_CONNECTION_HYSTERESIS_SEC_INT} * duration, {@code false} otherwise. */ public boolean isInSatelliteModeForCarrierRoaming(@Nullable Phone phone) { if (!mFeatureFlags.carrierEnabledSatelliteFlag()) { logd("isInSatelliteModeForCarrierRoaming: carrierEnabledSatelliteFlag is disabled"); return false; } if (phone == null) { return false; } if (!isSatelliteSupportedViaCarrier(phone.getSubId())) { return false; } ServiceState serviceState = phone.getServiceState(); if (serviceState != null && serviceState.isUsingNonTerrestrialNetwork()) { return true; } synchronized (mSatelliteConnectedLock) { Boolean isHysteresisTimeExpired = mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.get( phone.getSubId()); if (isHysteresisTimeExpired != null && isHysteresisTimeExpired) { continue; return false; } Long lastDisconnectedTime = Loading @@ -2586,11 +2631,34 @@ public class SatelliteController extends Handler { } else { mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.put( phone.getSubId(), true); mSatModeCapabilitiesForCarrierRoaming.remove(phone.getSubId()); return false; } } } /** * Return capabilities of carrier roaming satellite network. * * @param phone phone object * @return The list of services supported by the carrier associated with the {@code subId} */ @NonNull public List<Integer> getCapabilitiesForCarrierRoamingSatelliteMode(Phone phone) { if (!mFeatureFlags.carrierEnabledSatelliteFlag()) { logd("getCapabilitiesForCarrierRoamingSatelliteMode: carrierEnabledSatelliteFlag" + " is disabled"); return new ArrayList<>(); } synchronized (mSatelliteConnectedLock) { int subId = phone.getSubId(); if (mSatModeCapabilitiesForCarrierRoaming.containsKey(subId)) { return mSatModeCapabilitiesForCarrierRoaming.get(subId); } return false; } return new ArrayList<>(); } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) Loading Loading @@ -3716,6 +3784,14 @@ public class SatelliteController extends Handler { mWasSatelliteConnectedViaCarrier.put(phone.getSubId(), true); mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.put( phone.getSubId(), false); for (NetworkRegistrationInfo nri : serviceState.getNetworkRegistrationInfoList()) { if (nri.isNonTerrestrialNetwork()) { mSatModeCapabilitiesForCarrierRoaming.put(phone.getSubId(), nri.getAvailableServices()); } } } else { Boolean connected = mWasSatelliteConnectedViaCarrier.get(phone.getSubId()); if (connected != null && connected) { Loading tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java +10 −0 Original line number Diff line number Diff line Loading @@ -2477,12 +2477,16 @@ public class SatelliteControllerTest extends TelephonyTest { processAllMessages(); mSatelliteControllerUT.elapsedRealtime = 0; assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime()); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone)); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2)); when(mServiceState.isUsingNonTerrestrialNetwork()).thenReturn(false); when(mServiceState2.isUsingNonTerrestrialNetwork()).thenReturn(false); sendServiceStateChangedEvent(); processAllMessages(); assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime()); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone)); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2)); // Last satellite connected time of Phone2 should be 0 when(mServiceState2.isUsingNonTerrestrialNetwork()).thenReturn(true); Loading @@ -2492,6 +2496,8 @@ public class SatelliteControllerTest extends TelephonyTest { mSatelliteControllerUT.elapsedRealtime = 2 * 60 * 1000; // But Phone2 is connected to NTN right now assertTrue(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime()); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone)); assertTrue(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2)); // Last satellite disconnected time of Phone2 should be 2 * 60 * 1000 when(mServiceState2.isUsingNonTerrestrialNetwork()).thenReturn(false); Loading @@ -2499,10 +2505,14 @@ public class SatelliteControllerTest extends TelephonyTest { processAllMessages(); // Current time (2) - last disconnected time (2) < hysteresis timeout (1) assertTrue(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime()); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone)); assertTrue(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2)); // Current time (4) - last disconnected time (2) > hysteresis timeout (1) mSatelliteControllerUT.elapsedRealtime = 4 * 60 * 1000; assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime()); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone)); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2)); } @Test Loading Loading
src/java/com/android/internal/telephony/satellite/SatelliteController.java +98 −22 Original line number Diff line number Diff line Loading @@ -78,6 +78,7 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.NetworkRegistrationInfo; import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; Loading Loading @@ -334,6 +335,14 @@ public class SatelliteController extends Handler { @NonNull private final SparseBooleanArray mWasSatelliteConnectedViaCarrier = new SparseBooleanArray(); /** * Key: Subscription ID; Value: set of * {@link android.telephony.NetworkRegistrationInfo.ServiceType} */ @GuardedBy("mSatelliteConnectedLock") @NonNull private final Map<Integer, List<Integer>> mSatModeCapabilitiesForCarrierRoaming = new HashMap<>(); @GuardedBy("mSatelliteConnectedLock") @NonNull private final SparseBooleanArray mIsSatelliteConnectedViaCarrierHysteresisTimeExpired = new SparseBooleanArray(); Loading Loading @@ -2566,13 +2575,49 @@ public class SatelliteController extends Handler { return true; } for (Phone phone : PhoneFactory.getPhones()) { if (isSatelliteSupportedViaCarrier(phone.getSubId())) { if (isInSatelliteModeForCarrierRoaming(phone)) { logd("isSatelliteConnectedViaCarrierWithinHysteresisTime: " + "subId:" + phone.getSubId() + " is connected to satellite within hysteresis time"); return true; } } return false; } /** * Get whether device is connected to satellite via carrier. * * @param phone phone object * @return {@code true} if the device is connected to satellite using the phone within the * {@link CarrierConfigManager#KEY_SATELLITE_CONNECTION_HYSTERESIS_SEC_INT} * duration, {@code false} otherwise. */ public boolean isInSatelliteModeForCarrierRoaming(@Nullable Phone phone) { if (!mFeatureFlags.carrierEnabledSatelliteFlag()) { logd("isInSatelliteModeForCarrierRoaming: carrierEnabledSatelliteFlag is disabled"); return false; } if (phone == null) { return false; } if (!isSatelliteSupportedViaCarrier(phone.getSubId())) { return false; } ServiceState serviceState = phone.getServiceState(); if (serviceState != null && serviceState.isUsingNonTerrestrialNetwork()) { return true; } synchronized (mSatelliteConnectedLock) { Boolean isHysteresisTimeExpired = mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.get( phone.getSubId()); if (isHysteresisTimeExpired != null && isHysteresisTimeExpired) { continue; return false; } Long lastDisconnectedTime = Loading @@ -2586,11 +2631,34 @@ public class SatelliteController extends Handler { } else { mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.put( phone.getSubId(), true); mSatModeCapabilitiesForCarrierRoaming.remove(phone.getSubId()); return false; } } } /** * Return capabilities of carrier roaming satellite network. * * @param phone phone object * @return The list of services supported by the carrier associated with the {@code subId} */ @NonNull public List<Integer> getCapabilitiesForCarrierRoamingSatelliteMode(Phone phone) { if (!mFeatureFlags.carrierEnabledSatelliteFlag()) { logd("getCapabilitiesForCarrierRoamingSatelliteMode: carrierEnabledSatelliteFlag" + " is disabled"); return new ArrayList<>(); } synchronized (mSatelliteConnectedLock) { int subId = phone.getSubId(); if (mSatModeCapabilitiesForCarrierRoaming.containsKey(subId)) { return mSatModeCapabilitiesForCarrierRoaming.get(subId); } return false; } return new ArrayList<>(); } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) Loading Loading @@ -3716,6 +3784,14 @@ public class SatelliteController extends Handler { mWasSatelliteConnectedViaCarrier.put(phone.getSubId(), true); mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.put( phone.getSubId(), false); for (NetworkRegistrationInfo nri : serviceState.getNetworkRegistrationInfoList()) { if (nri.isNonTerrestrialNetwork()) { mSatModeCapabilitiesForCarrierRoaming.put(phone.getSubId(), nri.getAvailableServices()); } } } else { Boolean connected = mWasSatelliteConnectedViaCarrier.get(phone.getSubId()); if (connected != null && connected) { Loading
tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java +10 −0 Original line number Diff line number Diff line Loading @@ -2477,12 +2477,16 @@ public class SatelliteControllerTest extends TelephonyTest { processAllMessages(); mSatelliteControllerUT.elapsedRealtime = 0; assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime()); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone)); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2)); when(mServiceState.isUsingNonTerrestrialNetwork()).thenReturn(false); when(mServiceState2.isUsingNonTerrestrialNetwork()).thenReturn(false); sendServiceStateChangedEvent(); processAllMessages(); assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime()); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone)); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2)); // Last satellite connected time of Phone2 should be 0 when(mServiceState2.isUsingNonTerrestrialNetwork()).thenReturn(true); Loading @@ -2492,6 +2496,8 @@ public class SatelliteControllerTest extends TelephonyTest { mSatelliteControllerUT.elapsedRealtime = 2 * 60 * 1000; // But Phone2 is connected to NTN right now assertTrue(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime()); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone)); assertTrue(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2)); // Last satellite disconnected time of Phone2 should be 2 * 60 * 1000 when(mServiceState2.isUsingNonTerrestrialNetwork()).thenReturn(false); Loading @@ -2499,10 +2505,14 @@ public class SatelliteControllerTest extends TelephonyTest { processAllMessages(); // Current time (2) - last disconnected time (2) < hysteresis timeout (1) assertTrue(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime()); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone)); assertTrue(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2)); // Current time (4) - last disconnected time (2) > hysteresis timeout (1) mSatelliteControllerUT.elapsedRealtime = 4 * 60 * 1000; assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime()); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone)); assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2)); } @Test Loading