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_