diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/telephony/hlrlookup/HlrLookupCarrierDataProvider.java b/service/src/main/java/org/whispersystems/textsecuregcm/telephony/hlrlookup/HlrLookupCarrierDataProvider.java index 0ed65bfbf..c8631cf08 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/telephony/hlrlookup/HlrLookupCarrierDataProvider.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/telephony/hlrlookup/HlrLookupCarrierDataProvider.java @@ -147,7 +147,8 @@ public class HlrLookupCarrierDataProvider implements CarrierDataProvider { networkDetails.name(), lineType(result.telephoneNumberType()), mccFromMccMnc(networkDetails.mccmnc()), - mncFromMccMnc(networkDetails.mccmnc()), Optional.empty())); + mncFromMccMnc(networkDetails.mccmnc()), + isPorted(result.isPorted()))); } private static Tag getCreditsSpentTag(final HlrLookupResult hlrLookupResult) { @@ -174,15 +175,12 @@ public class HlrLookupCarrierDataProvider implements CarrierDataProvider { @VisibleForTesting static CarrierData.LineType lineType(@Nullable final String telephoneNumberType) { - if (telephoneNumberType == null) { - return CarrierData.LineType.UNKNOWN; - } - return switch (telephoneNumberType) { case "MOBILE" -> CarrierData.LineType.MOBILE; case "LANDLINE", "MOBILE_OR_LANDLINE" -> CarrierData.LineType.LANDLINE; case "VOIP" -> CarrierData.LineType.NON_FIXED_VOIP; case "UNKNOWN" -> CarrierData.LineType.UNKNOWN; + case null -> CarrierData.LineType.UNKNOWN; default -> CarrierData.LineType.OTHER; }; } @@ -198,6 +196,15 @@ public class HlrLookupCarrierDataProvider implements CarrierDataProvider { return Optional.empty(); } + @VisibleForTesting + static Optional isPorted(@Nullable final String isPorted) { + return switch (isPorted) { + case "YES" -> Optional.of(true); + case "NO" -> Optional.of(false); + case null, default -> Optional.empty(); + }; + } + @VisibleForTesting static HlrLookupResponse parseResponse(final String responseJson) throws JsonProcessingException { return OBJECT_MAPPER.readValue(responseJson, HlrLookupResponse.class); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/telephony/hlrlookup/HlrLookupResult.java b/service/src/main/java/org/whispersystems/textsecuregcm/telephony/hlrlookup/HlrLookupResult.java index 6651d2b58..f21b3f404 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/telephony/hlrlookup/HlrLookupResult.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/telephony/hlrlookup/HlrLookupResult.java @@ -15,5 +15,6 @@ record HlrLookupResult(String error, NetworkDetails originalNetworkDetails, String currentNetwork, NetworkDetails currentNetworkDetails, - String telephoneNumberType) { + String telephoneNumberType, + String isPorted) { } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/telephony/hlrlookup/HlrLookupCarrierDataProviderTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/telephony/hlrlookup/HlrLookupCarrierDataProviderTest.java index ee4922fde..d0eb18844 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/telephony/hlrlookup/HlrLookupCarrierDataProviderTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/telephony/hlrlookup/HlrLookupCarrierDataProviderTest.java @@ -110,8 +110,7 @@ class HlrLookupCarrierDataProviderTest { final Optional maybeCarrierData = hlrLookupCarrierDataProvider.lookupCarrierData(PhoneNumberUtil.getInstance().getExampleNumber("US"), Duration.ZERO); - assertEquals(Optional.of(new CarrierData("Virgin Mobile", CarrierData.LineType.MOBILE, Optional.of("234"), Optional.of("38"), - Optional.empty())), + assertEquals(Optional.of(new CarrierData("Virgin Mobile", CarrierData.LineType.MOBILE, Optional.of("234"), Optional.of("38"), Optional.of(true))), maybeCarrierData); } @@ -220,6 +219,25 @@ class HlrLookupCarrierDataProviderTest { ); } + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + @ParameterizedTest + @MethodSource + void isPorted(final String isPortedString, final Optional expectedIsPortedValue) { + final HlrLookupResult hlrLookupResult = + new HlrLookupResult("NONE", "NOT_AVAILABLE", null, "NOT_AVAILABLE", null, "MOBILE", isPortedString); + + assertEquals(expectedIsPortedValue, HlrLookupCarrierDataProvider.isPorted(hlrLookupResult.isPorted())); + } + + private static List isPorted() { + return List.of( + Arguments.argumentSet("Null isPorted string", null, Optional.empty()), + Arguments.argumentSet("Is ported", "YES", Optional.of(true)), + Arguments.argumentSet("Is not ported", "NO", Optional.of(false)), + Arguments.argumentSet("Unrecognized isPorted string", "UNKNOWN", Optional.empty()) + ); + } + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") @ParameterizedTest @MethodSource @@ -272,7 +290,8 @@ class HlrLookupCarrierDataProviderTest { originalNetwork, currentNetwork == null ? "NOT_AVAILABLE" : "AVAILABLE", currentNetwork, - "MOBILE"); + "MOBILE", + "NO"); } @Test