Commit ade5db8c authored by estade's avatar estade Committed by Commit bot

Redo Autofill wallet preferences on Android.

BUG=446700

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

Cr-Commit-Position: refs/heads/master@{#321508}
parent 92bc0de8
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2015 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 button that permits user to clear the local copy of a card. -->
<org.chromium.chrome.browser.widget.ButtonCompat
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:chrome="http://schemas.android.com/apk/res-auto"
android:id="@+id/preference_click_target"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:minHeight="40dp"
android:textColor="#fff"
android:text="@string/autofill_clear_local_copy_button"
chrome:buttonColor="@color/pref_accent_color" />
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2015 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 link that takes user to manage their Wallet data. -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/preference_click_target"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="15dp"
android:singleLine="true"
android:textColor="?android:attr/textColorLink"
android:textAllCaps="true"
android:text="@string/autofill_wallet_management_link_text" />
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2015 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 label that indicates where an autofill card or profile is stored. -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/PreferenceSummary"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end"
android:layout_marginBottom="16dp"
android:gravity="bottom"
android:singleLine="true"
android:text="@string/autofill_from_google_account" />
......@@ -10,8 +10,7 @@
android:summaryOn="@string/text_on"
android:summaryOff="@string/text_off" />
<org.chromium.chrome.browser.preferences.ChromeBasePreference
android:fragment="org.chromium.chrome.browser.preferences.autofill.AutofillWalletPreferences"
<org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
android:key="autofill_wallet"
android:title="@string/autofill_wallet_title" />
......
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2015 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. -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<Preference
android:key="server_card_description"
android:selectable="false" />
<org.chromium.chrome.browser.preferences.TextAndButtonPreference
android:key="server_card_edit_link"
android:widgetLayout="@layout/autofill_server_data_edit_link"
android:title="@string/autofill_from_google_account_long" />
<org.chromium.chrome.browser.preferences.TextAndButtonPreference
android:key="server_card_local_copy_button"
android:widgetLayout="@layout/autofill_server_card_clear_copy_button"
android:title="@string/autofill_describe_local_copy" />
</PreferenceScreen>
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2015 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. -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<Preference
android:key="server_profile_description"
android:selectable="false" />
<org.chromium.chrome.browser.preferences.TextAndButtonPreference
android:key="server_profile_edit_link"
android:widgetLayout="@layout/autofill_server_data_edit_link"
android:title="@string/autofill_from_google_account_long" />
</PreferenceScreen>
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2015 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.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" >
<org.chromium.chrome.browser.preferences.ChromeSwitchPreference
android:key="autofill_wallet_switch"
android:summaryOn="@string/text_on"
android:summaryOff="@string/text_off" />
<org.chromium.chrome.browser.preferences.TextMessagePreference
android:title="@string/autofill_wallet_description" />
<org.chromium.chrome.browser.preferences.TextMessagePreference
android:title="@string/autofill_wallet_cache_explanation" />
<org.chromium.chrome.browser.preferences.HyperlinkPreference
android:title="@string/autofill_wallet_management_link_text"
app:url="@string/autofill_manage_wallet_cards_url"
app:imitateWebLink="true" />
<org.chromium.chrome.browser.preferences.ButtonPreference
android:key="autofill_clear_unmasked_cards"
android:title="@string/autofill_wallet_clear_unmasked_cards" />
</PreferenceScreen>
......@@ -4,9 +4,12 @@
package org.chromium.chrome.browser.autofill;
import android.content.Context;
import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
import org.chromium.base.ThreadUtils;
import org.chromium.chrome.R;
import java.util.ArrayList;
import java.util.List;
......@@ -39,6 +42,7 @@ public class PersonalDataManager {
public static class AutofillProfile {
private String mGUID;
private String mOrigin;
private boolean mIsLocal;
private String mFullName;
private String mCompanyName;
private String mStreetAddress;
......@@ -54,25 +58,44 @@ public class PersonalDataManager {
private String mLanguageCode;
@CalledByNative("AutofillProfile")
public static AutofillProfile create(String guid, String origin,
String fullName, String companyName,
String streetAddress, String region, String locality, String dependentLocality,
String postalCode, String sortingCode,
public static AutofillProfile create(String guid, String origin, boolean isLocal,
String fullName, String companyName, String streetAddress, String region,
String locality, String dependentLocality, String postalCode, String sortingCode,
String country, String phoneNumber, String emailAddress, String languageCode) {
return new AutofillProfile(guid, origin, fullName, companyName,
streetAddress,
region, locality, dependentLocality,
postalCode, sortingCode, country, phoneNumber, emailAddress, languageCode);
return new AutofillProfile(guid, origin, isLocal, fullName, companyName, streetAddress,
region, locality, dependentLocality, postalCode, sortingCode, country,
phoneNumber, emailAddress, languageCode);
}
public AutofillProfile(String guid, String origin, boolean isLocal, String fullName,
String companyName, String streetAddress, String region, String locality,
String dependentLocality, String postalCode, String sortingCode, String countryCode,
String phoneNumber, String emailAddress, String languageCode) {
mGUID = guid;
mOrigin = origin;
mIsLocal = isLocal;
mFullName = fullName;
mCompanyName = companyName;
mStreetAddress = streetAddress;
mRegion = region;
mLocality = locality;
mDependentLocality = dependentLocality;
mPostalCode = postalCode;
mSortingCode = sortingCode;
mCountryCode = countryCode;
mPhoneNumber = phoneNumber;
mEmailAddress = emailAddress;
mLanguageCode = languageCode;
}
/** TODO(estade): remove this constructor. */
public AutofillProfile(String guid, String origin, String fullName, String companyName,
String streetAddress,
String region,
String locality, String dependentLocality,
String postalCode, String sortingCode,
String countryCode, String phoneNumber, String emailAddress, String languageCode) {
String streetAddress, String region, String locality, String dependentLocality,
String postalCode, String sortingCode, String countryCode, String phoneNumber,
String emailAddress, String languageCode) {
mGUID = guid;
mOrigin = origin;
mIsLocal = true;
mFullName = fullName;
mCompanyName = companyName;
mStreetAddress = streetAddress;
......@@ -161,6 +184,10 @@ public class PersonalDataManager {
return mLanguageCode;
}
public boolean getIsLocal() {
return mIsLocal;
}
public void setGUID(String guid) {
mGUID = guid;
}
......@@ -230,6 +257,8 @@ public class PersonalDataManager {
// marshaled and compared as strings. To save conversions, we use strings everywhere.
private String mGUID;
private String mOrigin;
private boolean mIsLocal;
private boolean mIsCached;
private String mName;
private String mNumber;
private String mObfuscatedNumber;
......@@ -237,15 +266,33 @@ public class PersonalDataManager {
private String mYear;
@CalledByNative("CreditCard")
public static CreditCard create(String guid, String origin, String name, String number,
String obfuscatedNumber, String month, String year) {
return new CreditCard(guid, origin, name, number, obfuscatedNumber, month, year);
public static CreditCard create(String guid, String origin, boolean isLocal,
boolean isCached, String name, String number, String obfuscatedNumber, String month,
String year) {
return new CreditCard(
guid, origin, isLocal, isCached, name, number, obfuscatedNumber, month, year);
}
public CreditCard(String guid, String origin, boolean isLocal, boolean isCached,
String name, String number, String obfuscatedNumber, String month, String year) {
mGUID = guid;
mOrigin = origin;
mIsLocal = isLocal;
mIsCached = isCached;
mName = name;
mNumber = number;
mObfuscatedNumber = obfuscatedNumber;
mMonth = month;
mYear = year;
}
/** TODO(estade): remove this constructor. */
public CreditCard(String guid, String origin, String name, String number,
String obfuscatedNumber, String month, String year) {
mGUID = guid;
mOrigin = origin;
mIsLocal = true;
mIsCached = false;
mName = name;
mNumber = number;
mObfuscatedNumber = obfuscatedNumber;
......@@ -287,6 +334,20 @@ public class PersonalDataManager {
return mYear;
}
public String getFormattedExpirationDate(Context context) {
return getMonth()
+ context.getResources().getString(
R.string.autofill_card_unmask_expiration_date_separator) + getYear();
}
public boolean getIsLocal() {
return mIsLocal;
}
public boolean getIsCached() {
return mIsCached;
}
public void setGUID(String guid) {
mGUID = guid;
}
......@@ -422,8 +483,8 @@ public class PersonalDataManager {
nativeRemoveByGUID(mPersonalDataManagerAndroid, guid);
}
public void clearUnmaskedCache() {
nativeClearUnmaskedCache(mPersonalDataManagerAndroid);
public void clearUnmaskedCache(String guid) {
nativeClearUnmaskedCache(mPersonalDataManagerAndroid, guid);
}
/**
......@@ -487,7 +548,8 @@ public class PersonalDataManager {
private native String nativeSetCreditCard(long nativePersonalDataManagerAndroid,
CreditCard card);
private native void nativeRemoveByGUID(long nativePersonalDataManagerAndroid, String guid);
private native void nativeClearUnmaskedCache(long nativePersonalDataManagerAndroid);
private native void nativeClearUnmaskedCache(
long nativePersonalDataManagerAndroid, String guid);
private static native boolean nativeIsAutofillEnabled();
private static native void nativeSetAutofillEnabled(boolean enable);
private static native boolean nativeIsAutofillManaged();
......
// 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.preferences;
import android.content.Context;
import android.preference.Preference;
import android.util.AttributeSet;
import android.view.View;
import org.chromium.chrome.R;
/**
* A {@link Preference} that provides label text plus button functionality.
*
* Preference.getOnPreferenceClickListener().onPreferenceClick() is called when the button is
* clicked. The button is defined by the widgetLayout attribute.
*/
public class TextAndButtonPreference extends Preference {
/**
* Constructor for inflating from XML
*/
public TextAndButtonPreference(Context context, AttributeSet attrs) {
super(context, attrs);
setSelectable(false);
}
@Override
protected void onBindView(View view) {
super.onBindView(view);
View button = view.findViewById(R.id.preference_click_target);
button.setClickable(true);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getOnPreferenceClickListener() != null) {
getOnPreferenceClickListener().onPreferenceClick(TextAndButtonPreference.this);
}
}
});
}
}
......@@ -33,8 +33,8 @@ import java.util.Locale;
*/
public class AutofillCreditCardEditor extends Fragment implements OnItemSelectedListener,
TextWatcher {
// GUID of the profile we are editing.
// May be the empty string if creating a new profile.
// GUID of the card profile we are editing.
// May be the empty string if creating a new card.
private String mGUID;
private FloatLabelLayout mNameLabel;
......@@ -192,12 +192,9 @@ public class AutofillCreditCardEditor extends Fragment implements OnItemSelected
private void saveCreditCard() {
// Remove all spaces in editText.
String cardNumber = mNumberText.getText().toString().replaceAll("\\s+", "");
CreditCard card = new CreditCard(
mGUID,
AutofillPreferences.SETTINGS_ORIGIN,
mNameText.getText().toString().trim(),
cardNumber,
cardNumber, // obfuscated number, it will be obfuscated by native code.
CreditCard card = new CreditCard(mGUID, AutofillPreferences.SETTINGS_ORIGIN,
true /* isLocal */, false /* isCached */, mNameText.getText().toString().trim(),
cardNumber, "" /* obfuscatedNumber */,
String.valueOf(mExpirationMonth.getSelectedItemPosition() + 1),
(String) mExpirationYear.getSelectedItem());
......
......@@ -12,13 +12,12 @@ import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceFragment;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.autofill.PersonalDataManager;
import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
import org.chromium.chrome.browser.preferences.ChromeBasePreference;
import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
/**
......@@ -28,16 +27,15 @@ public class AutofillPreferences extends PreferenceFragment
implements OnPreferenceChangeListener, PersonalDataManager.PersonalDataManagerObserver {
public static final String AUTOFILL_GUID = "guid";
// Need to be in sync with kSettingsOrigin[] in
// Needs to be in sync with kSettingsOrigin[] in
// chrome/browser/ui/webui/options/autofill_options_handler.cc
public static final String SETTINGS_ORIGIN = "Chrome settings";
private static final int SUMMARY_CHAR_LENGTH = 40;
private static final String PREF_AUTOFILL_SWITCH = "autofill_switch";
private static final String PREF_AUTOFILL_PROFILES = "autofill_profiles";
private static final String PREF_AUTOFILL_CREDIT_CARDS = "autofill_credit_cards";
private static final String PREF_AUTOFILL_WALLET = "autofill_wallet";
ChromeBasePreference mWalletPref;
ChromeBaseCheckBoxPreference mWalletPref;
@Override
public void onCreate(Bundle savedInstanceState) {
......@@ -47,10 +45,6 @@ public class AutofillPreferences extends PreferenceFragment
ChromeSwitchPreference autofillSwitch =
(ChromeSwitchPreference) findPreference(PREF_AUTOFILL_SWITCH);
boolean isAutofillEnabled = PersonalDataManager.isAutofillEnabled();
autofillSwitch.setChecked(isAutofillEnabled);
autofillSwitch.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
......@@ -59,7 +53,15 @@ public class AutofillPreferences extends PreferenceFragment
}
});
mWalletPref = (ChromeBasePreference) findPreference(PREF_AUTOFILL_WALLET);
mWalletPref = (ChromeBaseCheckBoxPreference) findPreference(PREF_AUTOFILL_WALLET);
mWalletPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
PersonalDataManager.setWalletImportEnabled((boolean) newValue);
return true;
}
});
setPreferenceCategoryIcons();
}
......@@ -99,21 +101,20 @@ public class AutofillPreferences extends PreferenceFragment
profileCategory.removeAll();
for (AutofillProfile profile : PersonalDataManager.getInstance().getProfiles()) {
// Add an item on the current page...
PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity());
screen.setTitle(profile.getFullName());
// TODO(aruslan): I18N and new UI style: http://crbug.com/178541.
String summary = profile.getLabel();
if (summary.length() > SUMMARY_CHAR_LENGTH) {
summary = summary.substring(0, SUMMARY_CHAR_LENGTH);
summary += "...";
Preference pref = new Preference(getActivity());
pref.setTitle(profile.getFullName());
pref.setSummary(profile.getLabel());
if (profile.getIsLocal()) {
pref.setFragment(AutofillProfileEditor.class.getName());
} else {
pref.setWidgetLayoutResource(R.layout.autofill_server_data_label);
pref.setFragment(AutofillServerProfilePreferences.class.getName());
}
screen.setSummary(summary);
screen.setFragment(AutofillProfileEditor.class.getName());
Bundle args = screen.getExtras();
Bundle args = pref.getExtras();
args.putString(AUTOFILL_GUID, profile.getGUID());
profileCategory.addPreference(screen);
profileCategory.addPreference(pref);
}
}
......@@ -123,19 +124,27 @@ public class AutofillPreferences extends PreferenceFragment
profileCategory.removeAll();
for (CreditCard card : PersonalDataManager.getInstance().getCreditCards()) {
// Add an item on the current page...
PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity());
screen.setTitle(card.getName());
screen.setSummary(card.getObfuscatedNumber());
screen.setFragment(AutofillCreditCardEditor.class.getName());
Bundle args = screen.getExtras();
Preference pref = new Preference(getActivity());
pref.setTitle(card.getObfuscatedNumber());
pref.setSummary(card.getFormattedExpirationDate(getActivity()));
if (card.getIsLocal()) {
pref.setFragment(AutofillCreditCardEditor.class.getName());
} else {
pref.setWidgetLayoutResource(R.layout.autofill_server_data_label);
pref.setFragment(AutofillServerCardPreferences.class.getName());
}
Bundle args = pref.getExtras();
args.putString(AUTOFILL_GUID, card.getGUID());
profileCategory.addPreference(screen);
profileCategory.addPreference(pref);
}
}
private void updateSummaries() {
ChromeSwitchPreference autofillSwitch =
(ChromeSwitchPreference) findPreference(PREF_AUTOFILL_SWITCH);
autofillSwitch.setChecked(PersonalDataManager.isAutofillEnabled());
if (!PersonalDataManager.isWalletImportFeatureAvailable()) {
getPreferenceScreen().removePreference(mWalletPref);
autofillSwitch.setDrawDivider(true);
......@@ -143,11 +152,8 @@ public class AutofillPreferences extends PreferenceFragment
if (getPreferenceScreen().findPreference(PREF_AUTOFILL_WALLET) == null) {
getPreferenceScreen().addPreference(mWalletPref);
}
mWalletPref.setSummary(getResources().getString(
PersonalDataManager.isWalletImportEnabled() ? R.string.text_on
: R.string.text_off));
autofillSwitch.setDrawDivider(false);
mWalletPref.setChecked(PersonalDataManager.isWalletImportEnabled());
}
}
......
......@@ -270,21 +270,14 @@ public class AutofillProfileEditor extends Fragment implements TextWatcher,
// Read edited data; save in the associated Chrome profile.
// Ignore empty fields.
private void saveProfile() {
AutofillProfile profile = new PersonalDataManager.AutofillProfile(
mGUID,
AutofillPreferences.SETTINGS_ORIGIN,
getFieldText(AddressField.RECIPIENT),
getFieldText(AddressField.ORGANIZATION),
getFieldText(AddressField.STREET_ADDRESS),
getFieldText(AddressField.ADMIN_AREA),
getFieldText(AddressField.LOCALITY),
getFieldText(AddressField.DEPENDENT_LOCALITY),
getFieldText(AddressField.POSTAL_CODE),
getFieldText(AddressField.SORTING_CODE),
mCountryCodes.get(mCurrentCountryPos),
mPhoneText.getText().toString(),
mEmailText.getText().toString(),
mLanguageCodeString);
AutofillProfile profile = new PersonalDataManager.AutofillProfile(mGUID,
AutofillPreferences.SETTINGS_ORIGIN, true /* isLocal */,
getFieldText(AddressField.RECIPIENT), getFieldText(AddressField.ORGANIZATION),
getFieldText(AddressField.STREET_ADDRESS), getFieldText(AddressField.ADMIN_AREA),
getFieldText(AddressField.LOCALITY), getFieldText(AddressField.DEPENDENT_LOCALITY),
getFieldText(AddressField.POSTAL_CODE), getFieldText(AddressField.SORTING_CODE),
mCountryCodes.get(mCurrentCountryPos), mPhoneText.getText().toString(),
mEmailText.getText().toString(), mLanguageCodeString);
PersonalDataManager.getInstance().setProfile(profile);
}
......
// Copyright 2015 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.preferences.autofill;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceFragment;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.autofill.PersonalDataManager;
import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
import org.chromium.chrome.browser.preferences.Preferences;
/**
* Fragment for settings page that allows user to view and edit a single server-provided credit
* card.
*/
public class AutofillServerCardPreferences
extends PreferenceFragment implements OnPreferenceClickListener {
private String mGUID;
private static final String PREF_SERVER_CARD_DESCRIPTION = "server_card_description";
private static final String PREF_SERVER_CARD_EDIT_LINK = "server_card_edit_link";
private static final String PREF_SERVER_CARD_LOCAL_COPY = "server_card_local_copy_button";
@Override
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
addPreferencesFromResource(R.xml.autofill_server_card_preferences);
getActivity().setTitle(R.string.autofill_edit_credit_card);
// We know which card to display based on the GUID stuffed in
// our extras by AutofillPreferences.
Bundle extras = getArguments();
if (extras != null) {
mGUID = extras.getString(AutofillPreferences.AUTOFILL_GUID);
}
assert mGUID != null;
CreditCard card = PersonalDataManager.getInstance().getCreditCard(mGUID);
assert !card.getIsLocal();
Preference cardDescription = findPreference(PREF_SERVER_CARD_DESCRIPTION);
cardDescription.setTitle(card.getObfuscatedNumber());
cardDescription.setSummary(card.getFormattedExpirationDate(getActivity()));
findPreference(PREF_SERVER_CARD_EDIT_LINK).setOnPreferenceClickListener(this);
Preference clearLocalCopy = findPreference(PREF_SERVER_CARD_LOCAL_COPY);
if (!card.getIsCached()) {
getPreferenceScreen().removePreference(clearLocalCopy);
} else {
clearLocalCopy.setOnPreferenceClickListener(this);
}
}
@Override
public boolean onPreferenceClick(Preference preference) {
if (preference.getKey().equals(PREF_SERVER_CARD_EDIT_LINK)) {
((Preferences) preference.getContext())
.showUrl(R.string.autofill_edit_credit_card,
R.string.autofill_manage_wallet_cards_url);
} else {
assert preference.getKey().equals(PREF_SERVER_CARD_LOCAL_COPY);
PersonalDataManager.getInstance().clearUnmaskedCache(mGUID);
// It's no longer cached locally. Hide the clear button.
getPreferenceScreen().removePreference(preference);
}
return true;
}
}
// Copyright 2015 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.preferences.autofill;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceFragment;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.autofill.PersonalDataManager;
import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
import org.chromium.chrome.browser.preferences.Preferences;
/**
* Fragment for settings page that allows user to view and edit a single server-provided address.
*/
public class AutofillServerProfilePreferences
extends PreferenceFragment implements OnPreferenceClickListener {
private String mGUID;
private static final String PREF_SERVER_PROFILE_DESCRIPTION = "server_profile_description";
private static final String PREF_SERVER_PROFILE_EDIT_LINK = "server_profile_edit_link";
@Override
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
addPreferencesFromResource(R.xml.autofill_server_profile_preferences);
getActivity().setTitle(R.string.autofill_edit_profile);
// We know which card to display based on the GUID stuffed in
// our extras by AutofillPreferences.
Bundle extras = getArguments();
if (extras != null) {
mGUID = extras.getString(AutofillPreferences.AUTOFILL_GUID);
}
assert mGUID != null;
AutofillProfile profile = PersonalDataManager.getInstance().getProfile(mGUID);
assert !profile.getIsLocal();
Preference profileDescription = findPreference(PREF_SERVER_PROFILE_DESCRIPTION);
profileDescription.setTitle(profile.getFullName());
profileDescription.setSummary(profile.getStreetAddress());
findPreference(PREF_SERVER_PROFILE_EDIT_LINK).setOnPreferenceClickListener(this);
}
@Override
public boolean onPreferenceClick(Preference preference) {
assert preference.getKey().equals(PREF_SERVER_PROFILE_EDIT_LINK);
((Preferences) preference.getContext())
.showUrl(R.string.autofill_edit_profile,
R.string.autofill_manage_wallet_addresses_url);
return true;
}
}
// Copyright 2015 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.preferences.autofill;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceFragment;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.autofill.PersonalDataManager;
import org.chromium.chrome.browser.preferences.ButtonPreference;
import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
/**
* Autofill Wallet integration fragment, which allows the user to control import of cards and
* addresses from their Wallet.
*/
public class AutofillWalletPreferences extends PreferenceFragment {
private static final String PREF_AUTOFILL_WALLET_SWITCH = "autofill_wallet_switch";
private static final String PREF_AUTOFILL_CLEAR_UNMASKED_CARDS =
"autofill_clear_unmasked_cards";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.autofill_wallet_preferences);
getActivity().setTitle(R.string.autofill_wallet_title);
ChromeSwitchPreference walletSwitch =
(ChromeSwitchPreference) findPreference(PREF_AUTOFILL_WALLET_SWITCH);
walletSwitch.setChecked(PersonalDataManager.isWalletImportEnabled());
walletSwitch.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
PersonalDataManager.setWalletImportEnabled((boolean) newValue);
return true;
}
});
ButtonPreference clearUnmaskedCards =
(ButtonPreference) findPreference(PREF_AUTOFILL_CLEAR_UNMASKED_CARDS);
clearUnmaskedCards.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
PersonalDataManager.getInstance().clearUnmaskedCache();
return true;
}
});
}
}
......@@ -204,25 +204,25 @@
<message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_EXPIRATION_DATE" desc="Label for text input field containing a credit card expiration date. [CHAR-LIMIT=32]">
Expiration date
</message>
<message name="IDS_AUTOFILL_DESCRIBE_LOCAL_COPY" desc="Text label that described a Wallet credit card which has been copied to the local Chrome instance.">
Copied to Chrome
</message>
<!-- Autofill/Wallet integration preferences -->
<message name="IDS_AUTOFILL_WALLET_TITLE" desc="Title for Autofill Wallet settings, which controls import of Wallet cards.">
Import Wallet data
<message name="IDS_AUTOFILL_WALLET_TITLE" desc="Text for checkbox that enables or disables import of Wallet data for Autofill.">
Show addresses and credit cards from Google Wallet
</message>
<message name="IDS_AUTOFILL_WALLET_DESCRIPTION" desc="Description of the Wallet import feature.">
With this feature is turned on, Chrome will offer to fill forms using addresses and credit cards from your Wallet.
<message name="IDS_AUTOFILL_WALLET_MANAGEMENT_LINK_TEXT" desc="Text for link that allows users to see and edit their Wallet information.">
Edit
</message>
<message name="IDS_AUTOFILL_WALLET_MANAGEMENT_LINK_TEXT" desc="Text for hyperlink to manage wallet address and credit cards.">
Manage Wallet data
</message>
<message name="IDS_AUTOFILL_WALLET_CACHE_EXPLANATION" desc="Explanation of how Chrome caches imported Wallet cards.">
After you authenticate a card, Chrome will cache it locally.
<message name="IDS_AUTOFILL_MANAGE_WALLET_CARDS_URL" desc="URL for managing wallet credit cards" translateable="false">
https://wallet.google.com/manage/paymentMethods
</message>
<message name="IDS_AUTOFILL_WALLET_CLEAR_UNMASKED_CARDS" desc="Text for button that allows user to clear Wallet card cache.">
Clear cache
<message name="IDS_AUTOFILL_MANAGE_WALLET_ADDRESSES_URL" desc="URL for managing wallet addresses" translateable="false">
https://wallet.google.com/manage/addressBook
</message>
<message name="IDS_AUTOFILL_MANAGE_WALLET_CARDS_URL" desc="URL for managing wallet credit cards" translateable="false">
https://wallet.google.com/manage/w/0/paymentMethods
<message name="IDS_AUTOFILL_FROM_GOOGLE_ACCOUNT_LONG" desc="Text that indicates an address or credit card came from Google servers.">
From Google Wallet
</message>
<!-- Save passwords preferences -->
......
......@@ -10528,12 +10528,6 @@ Chrome ran out of memory.
<message name="IDS_AUTOFILL_EDIT_PROFILE_BUTTON" desc="The label of the button that edits the currently selected Autofill profile.">
Edit...
</message>
<message name="IDS_AUTOFILL_FROM_GOOGLE_ACCOUNT" desc="Text that indicates an address or credit card came from Google.">
Google Wallet
</message>
<message name="IDS_AUTOFILL_CLEAR_LOCAL_COPY_BUTTON" desc="The label of the button that clears the local copy of a Wallet Credit Card.">
Clear copy
</message>
<message name="IDS_OPTIONS_MANAGE_AUTOFILL_SETTINGS_LINK" desc="The label of the 'Manage Autofill settings' link">
Manage Autofill settings
</message>
......@@ -10948,7 +10942,7 @@ Chrome ran out of memory.
<message name="IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK" desc="The label of the 'Manage passwords' link">
Manage passwords
</message>
<message name="IDS_OPTIONS_HOMEPAGE_TITLE" desc="The title of the home page overlay" formatter_data="android_java">
<message name="IDS_OPTIONS_HOMEPAGE_TITLE" desc="The title of the home page overlay" formatter_data="android_java">
Home page
</message>
<message name="IDS_OPTIONS_STARTUP_PAGES_PLACEHOLDER" desc="The placeholder text in the custom startup urls dialog" formatter_data="android_java">
......@@ -11257,6 +11251,12 @@ Chrome ran out of memory.
<message name="IDS_AUTOFILL_CARD_UNMASK_EXPIRATION_DATE_SEPARATOR" desc="Separator for a credit card expiration date, e.g. the slash in 05/16." formatter_data="android_java">
/
</message>
<message name="IDS_AUTOFILL_FROM_GOOGLE_ACCOUNT" desc="The name of the Google product that stores user addresses or credit cards in the cloud." formatter_data="android_java">
Google Wallet
</message>
<message name="IDS_AUTOFILL_CLEAR_LOCAL_COPY_BUTTON" desc="The label of the button that clears the local copy of a Wallet Credit Card." formatter_data="android_java">
Clear copy
</message>
<message name="IDS_APPEARANCE_GROUP_NAME" desc="The title of the appearance group">
Appearance
......
......@@ -46,9 +46,9 @@ ScopedJavaLocalRef<jobject> CreateJavaProfileFromNative(
JNIEnv* env,
const AutofillProfile& profile) {
return Java_AutofillProfile_create(
env,
ConvertUTF8ToJavaString(env, profile.guid()).obj(),
env, ConvertUTF8ToJavaString(env, profile.guid()).obj(),
ConvertUTF8ToJavaString(env, profile.origin()).obj(),
profile.record_type() == AutofillProfile::LOCAL_PROFILE,
ConvertUTF16ToJavaString(env, profile.GetRawInfo(NAME_FULL)).obj(),
ConvertUTF16ToJavaString(env, profile.GetRawInfo(COMPANY_NAME)).obj(),
ConvertUTF16ToJavaString(
......@@ -140,18 +140,17 @@ ScopedJavaLocalRef<jobject> CreateJavaCreditCardFromNative(
JNIEnv* env,
const CreditCard& card) {
return Java_CreditCard_create(
env,
ConvertUTF8ToJavaString(env, card.guid()).obj(),
env, ConvertUTF8ToJavaString(env, card.guid()).obj(),
ConvertUTF8ToJavaString(env, card.origin()).obj(),
card.record_type() == CreditCard::LOCAL_CARD,
card.record_type() == CreditCard::FULL_SERVER_CARD,
ConvertUTF16ToJavaString(env, card.GetRawInfo(CREDIT_CARD_NAME)).obj(),
ConvertUTF16ToJavaString(env, card.GetRawInfo(CREDIT_CARD_NUMBER)).obj(),
ConvertUTF16ToJavaString(env, card.TypeAndLastFourDigits()).obj(),
ConvertUTF16ToJavaString(env, card.GetRawInfo(CREDIT_CARD_EXP_MONTH))
.obj(),
ConvertUTF16ToJavaString(
env,
card.GetRawInfo(CREDIT_CARD_EXP_MONTH)).obj(),
ConvertUTF16ToJavaString(
env,
card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)).obj());
env, card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)).obj());
}
void PopulateNativeCreditCardFromJava(
......@@ -190,7 +189,7 @@ PersonalDataManagerAndroid::~PersonalDataManagerAndroid() {
jint PersonalDataManagerAndroid::GetProfileCount(JNIEnv* unused_env,
jobject unused_obj) {
return personal_data_manager_->web_profiles().size();
return personal_data_manager_->GetProfiles().size();
}
ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetProfileByIndex(
......@@ -198,7 +197,7 @@ ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetProfileByIndex(
jobject unused_obj,
jint index) {
const std::vector<AutofillProfile*>& profiles =
personal_data_manager_->web_profiles();
personal_data_manager_->GetProfiles();
size_t index_size_t = static_cast<size_t>(index);
DCHECK_LT(index_size_t, profiles.size());
return CreateJavaProfileFromNative(env, *profiles[index_size_t]);
......@@ -242,19 +241,15 @@ ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels(
jobject unused_obj) {
std::vector<base::string16> labels;
AutofillProfile::CreateInferredLabels(
personal_data_manager_->web_profiles(),
NULL,
NAME_FULL,
2,
g_browser_process->GetApplicationLocale(),
&labels);
personal_data_manager_->GetProfiles(), NULL, NAME_FULL, 2,
g_browser_process->GetApplicationLocale(), &labels);
return base::android::ToJavaArrayOfStrings(env, labels);
}
jint PersonalDataManagerAndroid::GetCreditCardCount(JNIEnv* unused_env,
jobject unused_obj) {
return personal_data_manager_->GetLocalCreditCards().size();
return personal_data_manager_->GetCreditCards().size();
}
ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetCreditCardByIndex(
......@@ -262,7 +257,7 @@ ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetCreditCardByIndex(
jobject unused_obj,
jint index) {
const std::vector<CreditCard*>& credit_cards =
personal_data_manager_->GetLocalCreditCards();
personal_data_manager_->GetCreditCards();
size_t index_size_t = static_cast<size_t>(index);
DCHECK_LT(index_size_t, credit_cards.size());
return CreateJavaCreditCardFromNative(env, *credit_cards[index_size_t]);
......@@ -307,8 +302,10 @@ void PersonalDataManagerAndroid::RemoveByGUID(JNIEnv* env,
}
void PersonalDataManagerAndroid::ClearUnmaskedCache(JNIEnv* env,
jobject unused_obj) {
personal_data_manager_->ResetFullServerCards();
jobject unused_obj,
jstring guid) {
personal_data_manager_->ResetFullServerCard(
ConvertJavaStringToUTF8(env, guid));
}
void PersonalDataManagerAndroid::OnPersonalDataChanged() {
......
......@@ -84,8 +84,8 @@ class PersonalDataManagerAndroid : public PersonalDataManagerObserver {
// Removes the profile or credit card represented by |jguid|.
void RemoveByGUID(JNIEnv* env, jobject unused_obj, jstring jguid);
// Rests all unmasked cards back to the masked state.
void ClearUnmaskedCache(JNIEnv* env, jobject unused_obj);
// Resets the given unmasked card back to the masked state.
void ClearUnmaskedCache(JNIEnv* env, jobject unused_obj, jstring jguid);
// PersonalDataManagerObserver:
void OnPersonalDataChanged() override;
......
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