/** * Gets a valid short number for the specified cost category. * * @param regionCode the region for which an example short number is needed * @param cost the cost category of number that is needed * @return a valid short number for the specified region and cost category. Returns an empty * string when the metadata does not contain such information, or the cost is UNKNOWN_COST. */ // @VisibleForTesting internal String getExampleShortNumberForCost(String regionCode, ShortNumberCost cost) { PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); if (phoneMetadata == null) { return(""); } PhoneNumberDesc desc = null; switch (cost) { case ShortNumberCost.TOLL_FREE: desc = phoneMetadata.getTollFree(); break; case ShortNumberCost.STANDARD_RATE: desc = phoneMetadata.getStandardRate(); break; case ShortNumberCost.PREMIUM_RATE: desc = phoneMetadata.getPremiumRate(); break; default: // UNKNOWN_COST numbers are computed by the process of elimination from the other cost // categories. break; } if (desc != null && desc.hasExampleNumber()) { return(desc.getExampleNumber()); } return(""); }
/** * Gets the expected cost category of a short number (however, nothing is implied about its * validity). If it is important that the number is valid, then its validity must first be checked * using {@link isValidShortNumber}. Note that emergency numbers are always considered toll-free. * Example usage: * <pre>{@code * PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); * ShortNumberInfo shortInfo = ShortNumberInfo.getInstance(); * PhoneNumber number = phoneUtil.parse("110", "FR"); * if (shortInfo.isValidShortNumber(number)) { * ShortNumberInfo.ShortNumberCost cost = shortInfo.getExpectedCost(number); * // Do something with the cost information here. * }}</pre> * * @param number the short number for which we want to know the expected cost category * @return the expected cost category of the short number. Returns UNKNOWN_COST if the number does * not match a cost category. Note that an invalid number may match any cost category. */ public ShortNumberCost getExpectedCost(PhoneNumber number) { List <String> regionCodes = phoneUtil.getRegionCodesForCountryCode(number.getCountryCode()); String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes); // Note that regionCode may be null, in which case phoneMetadata will also be null. PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); if (phoneMetadata == null) { return(ShortNumberCost.UNKNOWN_COST); } String nationalNumber = phoneUtil.getNationalSignificantNumber(number); // The cost categories are tested in order of decreasing expense, since if for some reason the // patterns overlap the most expensive matching cost category should be returned. if (phoneUtil.isNumberMatchingDesc(nationalNumber, phoneMetadata.getPremiumRate())) { return(ShortNumberCost.PREMIUM_RATE); } if (phoneUtil.isNumberMatchingDesc(nationalNumber, phoneMetadata.getStandardRate())) { return(ShortNumberCost.STANDARD_RATE); } if (phoneUtil.isNumberMatchingDesc(nationalNumber, phoneMetadata.getTollFree())) { return(ShortNumberCost.TOLL_FREE); } if (isEmergencyNumber(nationalNumber, regionCode)) { // Emergency numbers are implicitly toll-free. return(ShortNumberCost.TOLL_FREE); } return(ShortNumberCost.UNKNOWN_COST); }