package org.asamk.signal.manager.util; import com.google.i18n.phonenumbers.NumberParseException; import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; import org.asamk.signal.manager.api.InvalidNumberException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PhoneNumberFormatter { private static final Logger logger = LoggerFactory.getLogger(PhoneNumberFormatter.class); private static String impreciseFormatNumber(String number, String localNumber) { number = number.replaceAll("[^0-9+]", ""); if (number.charAt(0) == '+') return number; if (localNumber.charAt(0) == '+') localNumber = localNumber.substring(1); if (localNumber.length() == number.length() || number.length() > localNumber.length()) return "+" + number; int difference = localNumber.length() - number.length(); return "+" + localNumber.substring(0, difference) + number; } public static String formatNumber(String number, String localNumber) throws InvalidNumberException { if (number == null) { throw new InvalidNumberException("Null String passed as number."); } if (number.contains("@")) { throw new InvalidNumberException("Possible attempt to use email address."); } number = number.replaceAll("[^0-9+]", ""); if (number.isEmpty()) { throw new InvalidNumberException("No valid characters found."); } try { PhoneNumberUtil util = PhoneNumberUtil.getInstance(); PhoneNumber localNumberObject = util.parse(localNumber, null); String localCountryCode = util.getRegionCodeForNumber(localNumberObject); logger.trace("Got local CC: {}", localCountryCode); PhoneNumber numberObject = util.parse(number, localCountryCode); return util.format(numberObject, PhoneNumberFormat.E164); } catch (NumberParseException e) { logger.debug("{}: {}", e.getClass().getSimpleName(), e.getMessage()); return impreciseFormatNumber(number, localNumber); } } }