• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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