Format and validate phone number by using libphonenumber

Refer details on bug and
https://docs.google.com/a/google.com/document/d/1H8U486cj5Y1gyWObWToyIp_v50LK01rA5UPBu3yqENY

BUG=689046

Review-Url: https://codereview.chromium.org/2743763003
Cr-Commit-Position: refs/heads/master@{#456897}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 32fbc92d..fc3bac2 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2945,6 +2945,8 @@
       "android/webapps/webapp_registry.h",
       "autofill/android/personal_data_manager_android.cc",
       "autofill/android/personal_data_manager_android.h",
+      "autofill/android/phone_number_util_android.cc",
+      "autofill/android/phone_number_util_android.h",
       "chrome_browser_field_trials_mobile.cc",
       "chrome_browser_field_trials_mobile.h",
       "dom_distiller/dom_distiller_service_factory_android.cc",
@@ -3077,6 +3079,7 @@
       "//third_party/android_opengl/etc1",
       "//third_party/android_tools:cpu_features",
       "//third_party/libaddressinput:util",
+      "//third_party/libphonenumber",
       "//third_party/smhasher:murmurhash2",
     ]
 
@@ -3956,6 +3959,7 @@
       "../android/java/src/org/chromium/chrome/browser/autofill/CreditCardScannerBridge.java",
       "../android/java/src/org/chromium/chrome/browser/autofill/PasswordGenerationPopupBridge.java",
       "../android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java",
+      "../android/java/src/org/chromium/chrome/browser/autofill/PhoneNumberUtil.java",
       "../android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java",
       "../android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java",
       "../android/java/src/org/chromium/chrome/browser/browsing_data/UrlFilterBridge.java",
diff --git a/chrome/browser/android/chrome_jni_registrar.cc b/chrome/browser/android/chrome_jni_registrar.cc
index 0b83b604..d57a1cd6 100644
--- a/chrome/browser/android/chrome_jni_registrar.cc
+++ b/chrome/browser/android/chrome_jni_registrar.cc
@@ -108,6 +108,7 @@
 #include "chrome/browser/android/webapk/webapk_update_manager.h"
 #include "chrome/browser/android/webapps/add_to_homescreen_manager.h"
 #include "chrome/browser/autofill/android/personal_data_manager_android.h"
+#include "chrome/browser/autofill/android/phone_number_util_android.h"
 #include "chrome/browser/dom_distiller/dom_distiller_service_factory_android.h"
 #include "chrome/browser/dom_distiller/tab_utils_android.h"
 #include "chrome/browser/engagement/site_engagement_service_android.h"
@@ -355,6 +356,7 @@
      PermissionUpdateInfoBarDelegate::RegisterPermissionUpdateInfoBarDelegate},
     {"PersonalDataManagerAndroid",
      autofill::PersonalDataManagerAndroid::Register},
+    {"PhoneNumberUtil", RegisterPhoneNumberUtil},
     {"PhysicalWebDataSourceAndroid",
      PhysicalWebDataSourceAndroid::RegisterPhysicalWebDataSource},
     {"PolicyAuditor", RegisterPolicyAuditor},
diff --git a/chrome/browser/autofill/android/DEPS b/chrome/browser/autofill/android/DEPS
index 901959f5..d04315b 100644
--- a/chrome/browser/autofill/android/DEPS
+++ b/chrome/browser/autofill/android/DEPS
@@ -1,3 +1,4 @@
 include_rules = [
   '+third_party/libaddressinput',
+  '+third_party/libphonenumber',
 ]
diff --git a/chrome/browser/autofill/android/phone_number_util_android.cc b/chrome/browser/autofill/android/phone_number_util_android.cc
new file mode 100644
index 0000000..21501eaa
--- /dev/null
+++ b/chrome/browser/autofill/android/phone_number_util_android.cc
@@ -0,0 +1,79 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/autofill/android/phone_number_util_android.h"
+
+#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
+#include "chrome/browser/browser_process.h"
+#include "components/autofill/core/browser/autofill_country.h"
+#include "jni/PhoneNumberUtil_jni.h"
+#include "third_party/libphonenumber/phonenumber_api.h"
+
+namespace autofill {
+
+namespace {
+using ::base::android::ConvertJavaStringToUTF8;
+using ::base::android::ConvertUTF8ToJavaString;
+using ::base::android::JavaParamRef;
+using ::base::android::ScopedJavaLocalRef;
+using ::i18n::phonenumbers::PhoneNumber;
+using ::i18n::phonenumbers::PhoneNumberUtil;
+} // namespace
+
+// Formats the given number |jphone_number| to
+// i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat::INTERNATIONAL format
+// by using i18n::phonenumbers::PhoneNumberUtil::Format.
+ScopedJavaLocalRef<jstring> Format(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jclass>& jcaller,
+    const JavaParamRef<jstring>& jphone_number) {
+  const std::string phone_number = ConvertJavaStringToUTF8(env, jphone_number);
+  const std::string default_region_code =
+      autofill::AutofillCountry::CountryCodeForLocale(
+          g_browser_process->GetApplicationLocale());
+
+  PhoneNumber parsed_number;
+  PhoneNumberUtil* phone_number_util = PhoneNumberUtil::GetInstance();
+  if (phone_number_util->Parse(phone_number, default_region_code,
+                               &parsed_number) !=
+      PhoneNumberUtil::NO_PARSING_ERROR) {
+    return ConvertUTF8ToJavaString(env, phone_number);
+  }
+
+  std::string formatted_number;
+  phone_number_util->Format(parsed_number,
+                            PhoneNumberUtil::PhoneNumberFormat::INTERNATIONAL,
+                            &formatted_number);
+
+  return ConvertUTF8ToJavaString(env, formatted_number);
+}
+
+// Checks whether the given number |jphone_number| is valid by using
+// i18n::phonenumbers::PhoneNumberUtil::IsValidNumber.
+jboolean IsValidNumber(JNIEnv* env,
+                       const base::android::JavaParamRef<jclass>& jcaller,
+                       const JavaParamRef<jstring>& jphone_number) {
+  const std::string phone_number = ConvertJavaStringToUTF8(env, jphone_number);
+  const std::string default_region_code =
+      autofill::AutofillCountry::CountryCodeForLocale(
+          g_browser_process->GetApplicationLocale());
+
+  PhoneNumber parsed_number;
+  PhoneNumberUtil* phone_number_util = PhoneNumberUtil::GetInstance();
+  if (phone_number_util->Parse(phone_number, default_region_code,
+                               &parsed_number) !=
+      PhoneNumberUtil::NO_PARSING_ERROR) {
+    return false;
+  }
+
+  return phone_number_util->IsValidNumber(parsed_number);
+}
+
+}  // namespace autofill
+
+// static
+bool RegisterPhoneNumberUtil(JNIEnv* env) {
+  return autofill::RegisterNativesImpl(env);
+}
diff --git a/chrome/browser/autofill/android/phone_number_util_android.h b/chrome/browser/autofill/android/phone_number_util_android.h
new file mode 100644
index 0000000..17c85c6
--- /dev/null
+++ b/chrome/browser/autofill/android/phone_number_util_android.h
@@ -0,0 +1,12 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_AUTOFILL_ANDROID_PHONE_NUMBER_UTIL_ANDROID_H_
+#define CHROME_BROWSER_AUTOFILL_ANDROID_PHONE_NUMBER_UTIL_ANDROID_H_
+
+#include <jni.h>
+
+bool RegisterPhoneNumberUtil(JNIEnv* env);
+
+#endif  // CHROME_BROWSER_AUTOFILL_ANDROID_PHONE_NUMBER_UTIL_ANDROID_H_