1 package com.google.phonenumbers.demoapp.phonenumbers; 2 3 import com.google.i18n.phonenumbers.NumberParseException; 4 import com.google.i18n.phonenumbers.PhoneNumberUtil; 5 import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; 6 import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; 7 import com.google.i18n.phonenumbers.ShortNumberInfo; 8 import com.google.phonenumbers.demoapp.phonenumbers.PhoneNumberInApp.FormattingState; 9 10 /** 11 * Handles everything related to the formatting {@link PhoneNumberInApp}s to E.164 format (e.g. 12 * {@code +41446681800}) using LibPhoneNumber ({@link PhoneNumberUtil}). 13 */ 14 public class PhoneNumberFormatting { 15 16 private static final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); 17 private static final ShortNumberInfo shortNumberInfo = ShortNumberInfo.getInstance(); 18 PhoneNumberFormatting()19 private PhoneNumberFormatting() {} 20 21 /** 22 * Attempts to format the param {@code phoneNumberInApp} in E.164 format (e.g. {@code 23 * +41446681800}) using the country from param {@code nameCodeToUse} (e.g. {@code CH}). 24 * 25 * @param phoneNumberInApp PhoneNumberInApp to format to E.164 format 26 * @param nameCodeToUse String in format of a name code (e.g. {@code CH}) 27 * @param ignoreWhitespace boolean whether a phone number should be treated as {@link 28 * FormattingState#NUMBER_IS_ALREADY_IN_E164} instead of suggesting to remove whitespace if 29 * that whitespace is the only difference 30 */ formatPhoneNumberInApp( PhoneNumberInApp phoneNumberInApp, String nameCodeToUse, boolean ignoreWhitespace)31 public static void formatPhoneNumberInApp( 32 PhoneNumberInApp phoneNumberInApp, String nameCodeToUse, boolean ignoreWhitespace) { 33 PhoneNumber originalPhoneNumberParsed; 34 35 // Check PARSING_ERROR 36 try { 37 originalPhoneNumberParsed = 38 phoneNumberUtil.parse(phoneNumberInApp.getOriginalPhoneNumber(), nameCodeToUse); 39 } catch (NumberParseException e) { 40 phoneNumberInApp.setFormattingState(FormattingState.PARSING_ERROR); 41 return; 42 } 43 44 // Check NUMBER_IS_SHORT_NUMBER 45 if (shortNumberInfo.isValidShortNumber(originalPhoneNumberParsed)) { 46 phoneNumberInApp.setFormattingState(FormattingState.NUMBER_IS_SHORT_NUMBER); 47 return; 48 } 49 50 // Check NUMBER_IS_NOT_VALID 51 if (!phoneNumberUtil.isValidNumber(originalPhoneNumberParsed)) { 52 phoneNumberInApp.setFormattingState(FormattingState.NUMBER_IS_NOT_VALID); 53 return; 54 } 55 56 String formattedPhoneNumber = 57 phoneNumberUtil.format(originalPhoneNumberParsed, PhoneNumberFormat.E164); 58 59 // Check NUMBER_IS_ALREADY_IN_E164 60 if (ignoreWhitespace 61 ? phoneNumberInApp 62 .getOriginalPhoneNumber() 63 .replaceAll("\\s+", "") 64 .equals(formattedPhoneNumber) 65 : phoneNumberInApp.getOriginalPhoneNumber().equals(formattedPhoneNumber)) { 66 phoneNumberInApp.setFormattingState(FormattingState.NUMBER_IS_ALREADY_IN_E164); 67 return; 68 } 69 70 phoneNumberInApp.setFormattedPhoneNumber(formattedPhoneNumber); 71 phoneNumberInApp.setFormattingState(FormattingState.COMPLETED); 72 phoneNumberInApp.setShouldContactBeUpdated(true); 73 } 74 } 75