Commit 31a65669 authored by estade@chromium.org's avatar estade@chromium.org

Turn Autofill country text input into a Spinner.

BUG=399149

Review URL: https://codereview.chromium.org/436563005

Cr-Commit-Position: refs/heads/master@{#289021}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@289021 0039d316-1c4b-4281-b951-d872f2087c98
parent 4e719f44
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2014 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.
-->
<!-- Layout for each item in the country spinner dropdown -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/country_item"
android:gravity="center_vertical"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:padding="10dp"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceListItem" />
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2014 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.
-->
<!-- Layout for text of the country spinner -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/country_text"
android:gravity="center_vertical"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:paddingStart="8dp"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium" />
// Copyright 2014 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.
package org.chromium.chrome.browser.autofill;
import android.database.DataSetObserver;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import org.chromium.base.JNINamespace;
import org.chromium.chrome.R;
/**
* Android wrapper for CountryComboboxModel.
*
* Only useable from the UI layer. Used in the Android settings UI.
* See chrome/browser/ui/android/autofill/country_adapter_android.h for more details.
*/
@JNINamespace("autofill")
public class CountryAdapter implements SpinnerAdapter {
/**
* The items to show in the spinner.
*
* Even indices are display names, odd indices are country codes.
*/
private String[] mItems;
private LayoutInflater mInflater;
private final long mCountryAdapterAndroid;
public CountryAdapter(LayoutInflater inflater) {
mInflater = inflater;
mCountryAdapterAndroid = nativeInit();
mItems = nativeGetItems(mCountryAdapterAndroid);
}
@Override
public int getCount() {
return mItems.length / 2;
}
@Override
public Object getItem(int position) {
return mItems[position * 2 + 1];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = null;
if (convertView instanceof TextView) {
textView = (TextView) convertView;
}
if (textView == null) {
textView = (TextView) mInflater.inflate(R.layout.country_text, parent, false);
}
textView.setText(mItems[position * 2]);
return textView;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
TextView textView = null;
if (convertView instanceof TextView) {
textView = (TextView) convertView;
}
if (textView == null) {
textView = (TextView) mInflater.inflate(R.layout.country_item, parent, false);
}
textView.setText(mItems[position * 2]);
return textView;
}
/**
* Gets the index in the model for the given country code.
*/
public int getIndexForCountryCode(String countryCode) {
for (int i = 0; i < getCount(); i++) {
if (countryCode.equals(getItem(i))) {
return i;
}
}
return 0;
}
private native long nativeInit();
private native String[] nativeGetItems(long nativeCountryAdapterAndroid);
}
......@@ -47,7 +47,7 @@ public class PersonalDataManager {
private String mDependentLocality;
private String mPostalCode;
private String mSortingCode;
private String mCountry;
private String mCountryCode;
private String mPhoneNumber;
private String mEmailAddress;
private String mLabel;
......@@ -70,7 +70,7 @@ public class PersonalDataManager {
String region,
String locality, String dependentLocality,
String postalCode, String sortingCode,
String country, String phoneNumber, String emailAddress, String languageCode) {
String countryCode, String phoneNumber, String emailAddress, String languageCode) {
mGUID = guid;
mOrigin = origin;
mFullName = fullName;
......@@ -81,7 +81,7 @@ public class PersonalDataManager {
mDependentLocality = dependentLocality;
mPostalCode = postalCode;
mSortingCode = sortingCode;
mCountry = country;
mCountryCode = countryCode;
mPhoneNumber = phoneNumber;
mEmailAddress = emailAddress;
mLanguageCode = languageCode;
......@@ -142,12 +142,8 @@ public class PersonalDataManager {
}
@CalledByNative("AutofillProfile")
public String getCountry() {
return mCountry;
}
public String getCountryCode() {
return nativeToCountryCode(mCountry);
return mCountryCode;
}
@CalledByNative("AutofillProfile")
......@@ -209,8 +205,8 @@ public class PersonalDataManager {
mSortingCode = sortingCode;
}
public void setCountry(String country) {
mCountry = country;
public void setCountryCode(String countryCode) {
mCountryCode = countryCode;
}
public void setPhoneNumber(String phoneNumber) {
......
......@@ -53,7 +53,7 @@ public class PersonalDataManagerTest extends ChromeShellTestBase {
assertEquals(2, mHelper.getNumberOfProfiles());
profile.setGUID(profileOneGUID);
profile.setCountry("Canada");
profile.setCountryCode("CA");
mHelper.setProfile(profile);
assertEquals("Should still have only two profiles", 2, mHelper.getNumberOfProfiles());
......
......@@ -54,6 +54,7 @@
#include "chrome/browser/ui/android/autofill/autofill_dialog_result.h"
#include "chrome/browser/ui/android/autofill/autofill_logger_android.h"
#include "chrome/browser/ui/android/autofill/autofill_popup_view_android.h"
#include "chrome/browser/ui/android/autofill/country_adapter_android.h"
#include "chrome/browser/ui/android/chrome_http_auth_handler.h"
#include "chrome/browser/ui/android/context_menu_helper.h"
#include "chrome/browser/ui/android/infobars/auto_login_infobar_delegate_android.h"
......@@ -127,6 +128,7 @@ static base::android::RegistrationMethod kChromeRegisteredMethods[] = {
{ "ConfirmInfoBarDelegate", RegisterConfirmInfoBarDelegate },
{ "ContentViewUtil", RegisterContentViewUtil },
{ "ContextMenuHelper", RegisterContextMenuHelper },
{ "CountryAdapterAndroid", autofill::CountryAdapterAndroid::Register },
{ "DataReductionProxyInfoBarDelegate", DataReductionProxyInfoBar::Register },
{ "DataReductionProxySettings", DataReductionProxySettingsAndroid::Register },
{ "DevToolsServer", RegisterDevToolsServer },
......
......@@ -43,30 +43,20 @@ ScopedJavaLocalRef<jobject> CreateJavaProfileFromNative(
ConvertUTF16ToJavaString(env, profile.GetRawInfo(NAME_FULL)).obj(),
ConvertUTF16ToJavaString(env, profile.GetRawInfo(COMPANY_NAME)).obj(),
ConvertUTF16ToJavaString(
env,
profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)).obj(),
ConvertUTF16ToJavaString(
env,
profile.GetRawInfo(ADDRESS_HOME_STATE)).obj(),
ConvertUTF16ToJavaString(
env,
profile.GetRawInfo(ADDRESS_HOME_CITY)).obj(),
ConvertUTF16ToJavaString(
env,
profile.GetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY)).obj(),
ConvertUTF16ToJavaString(
env,
profile.GetRawInfo(ADDRESS_HOME_ZIP)).obj(),
ConvertUTF16ToJavaString(
env,
profile.GetRawInfo(ADDRESS_HOME_SORTING_CODE)).obj(),
env, profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)).obj(),
ConvertUTF16ToJavaString(env, profile.GetRawInfo(ADDRESS_HOME_STATE))
.obj(),
ConvertUTF16ToJavaString(env, profile.GetRawInfo(ADDRESS_HOME_CITY))
.obj(),
ConvertUTF16ToJavaString(
env,
profile.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY),
g_browser_process->GetApplicationLocale())).obj(),
env, profile.GetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY)).obj(),
ConvertUTF16ToJavaString(env, profile.GetRawInfo(ADDRESS_HOME_ZIP)).obj(),
ConvertUTF16ToJavaString(
env,
profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)).obj(),
env, profile.GetRawInfo(ADDRESS_HOME_SORTING_CODE)).obj(),
ConvertUTF16ToJavaString(env, profile.GetRawInfo(ADDRESS_HOME_COUNTRY))
.obj(),
ConvertUTF16ToJavaString(env, profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER))
.obj(),
ConvertUTF16ToJavaString(env, profile.GetRawInfo(EMAIL_ADDRESS)).obj(),
ConvertUTF8ToJavaString(env, profile.language_code()).obj());
}
......@@ -118,11 +108,10 @@ void PopulateNativeProfileFromJava(
ConvertJavaStringToUTF16(
Java_AutofillProfile_getSortingCode(env, jprofile)),
g_browser_process->GetApplicationLocale());
profile->SetInfo(
AutofillType(ADDRESS_HOME_COUNTRY),
ConvertJavaStringToUTF16(
Java_AutofillProfile_getCountry(env, jprofile)),
g_browser_process->GetApplicationLocale());
profile->SetInfo(AutofillType(ADDRESS_HOME_COUNTRY),
ConvertJavaStringToUTF16(
Java_AutofillProfile_getCountryCode(env, jprofile)),
g_browser_process->GetApplicationLocale());
profile->SetInfo(
AutofillType(PHONE_HOME_WHOLE_NUMBER),
ConvertJavaStringToUTF16(
......
// Copyright 2014 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/ui/android/autofill/country_adapter_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/autofill/personal_data_manager_factory.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "components/autofill/core/browser/autofill_country.h"
#include "jni/CountryAdapter_jni.h"
namespace autofill {
CountryAdapterAndroid::CountryAdapterAndroid(JNIEnv* env, jobject obj)
: weak_java_obj_(env, obj) {
country_combobox_model_.SetCountries(
*PersonalDataManagerFactory::GetForProfile(
ProfileManager::GetActiveUserProfile()),
base::Callback<bool(const std::string&)>());
}
CountryAdapterAndroid::~CountryAdapterAndroid() {}
ScopedJavaLocalRef<jobjectArray> CountryAdapterAndroid::GetItems(
JNIEnv* env,
jobject unused_obj) {
std::vector<base::string16> country_names_and_codes;
country_names_and_codes.reserve(
2 * country_combobox_model_.countries().size());
for (size_t i = 0; i < country_combobox_model_.countries().size(); ++i) {
country_names_and_codes.push_back(
country_combobox_model_.countries()[i]->name());
country_names_and_codes.push_back(base::ASCIIToUTF16(
country_combobox_model_.countries()[i]->country_code()));
}
return base::android::ToJavaArrayOfStrings(env, country_names_and_codes);
}
// static
bool CountryAdapterAndroid::Register(JNIEnv* env) {
return RegisterNativesImpl(env);
}
static jlong Init(JNIEnv* env, jobject obj) {
CountryAdapterAndroid* country_adapter_android =
new CountryAdapterAndroid(env, obj);
return reinterpret_cast<intptr_t>(country_adapter_android);
}
} // namespace autofill
// Copyright 2014 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_UI_ANDROID_AUTOFILL_COUNTRY_ADAPTER_ANDROID_H_
#define CHROME_BROWSER_UI_ANDROID_AUTOFILL_COUNTRY_ADAPTER_ANDROID_H_
#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "chrome/browser/ui/autofill/country_combobox_model.h"
namespace autofill {
// A bridge class for showing a list of countries in the Android settings UI.
class CountryAdapterAndroid {
public:
CountryAdapterAndroid(JNIEnv* env, jobject obj);
// Gets all the country codes and names. Every even index is a country name,
// and the following odd index is the associated country code.
base::android::ScopedJavaLocalRef<jobjectArray>
GetItems(JNIEnv* env, jobject unused_obj);
// Registers the JNI bindings for this class.
static bool Register(JNIEnv* env);
private:
~CountryAdapterAndroid();
// Pointer to the java counterpart.
JavaObjectWeakGlobalRef weak_java_obj_;
CountryComboboxModel country_combobox_model_;
};
} // namespace autofill
#endif // CHROME_BROWSER_UI_ANDROID_AUTOFILL_COUNTRY_ADAPTER_ANDROID_H_
......@@ -39,8 +39,11 @@ void CountryComboboxModel::SetCountries(
const std::string& app_locale = g_browser_process->GetApplicationLocale();
if (filter.is_null() || filter.Run(default_country_code)) {
countries_.push_back(new AutofillCountry(default_country_code, app_locale));
// The separator item.
#if !defined(OS_ANDROID)
// The separator item. On Android, there are separators after all items, so
// this is unnecessary.
countries_.push_back(NULL);
#endif
}
// The sorted list of countries.
......
......@@ -2770,6 +2770,7 @@
'android/java/src/org/chromium/chrome/browser/autofill/AutofillDialogResult.java',
'android/java/src/org/chromium/chrome/browser/autofill/AutofillLogger.java',
'android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java',
'android/java/src/org/chromium/chrome/browser/autofill/CountryAdapter.java',
'android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java',
'android/java/src/org/chromium/chrome/browser/BookmarksBridge.java',
'android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java',
......
......@@ -16,6 +16,8 @@
'browser/ui/android/autofill/autofill_logger_android.h',
'browser/ui/android/autofill/autofill_popup_view_android.cc',
'browser/ui/android/autofill/autofill_popup_view_android.h',
'browser/ui/android/autofill/country_adapter_android.cc',
'browser/ui/android/autofill/country_adapter_android.h',
'browser/ui/android/content_settings/popup_blocked_infobar_delegate.cc',
'browser/ui/android/content_settings/popup_blocked_infobar_delegate.h',
'browser/ui/android/infobars/auto_login_infobar_delegate_android.cc',
......@@ -103,6 +105,8 @@
'browser/ui/autofill/chrome_autofill_client.cc',
'browser/ui/autofill/chrome_autofill_client.h',
'browser/ui/autofill/chrome_autofill_client_mac.mm',
'browser/ui/autofill/country_combobox_model.cc',
'browser/ui/autofill/country_combobox_model.h',
'browser/ui/autofill/loading_animation.cc',
'browser/ui/autofill/loading_animation.h',
'browser/ui/autofill/password_generation_popup_controller_impl.cc',
......@@ -1355,8 +1359,6 @@
'browser/ui/autofill/account_chooser_model.h',
'browser/ui/autofill/autofill_dialog_sign_in_delegate.cc',
'browser/ui/autofill/autofill_dialog_sign_in_delegate.h',
'browser/ui/autofill/country_combobox_model.cc',
'browser/ui/autofill/country_combobox_model.h',
'browser/ui/autofill/generated_credit_card_bubble_controller.cc',
'browser/ui/autofill/generated_credit_card_bubble_controller.h',
'browser/ui/autofill/generated_credit_card_bubble_view.cc',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment