wallet_items.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_items.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <limits>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/autofill/content/browser/wallet/gaia_account.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_type.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "grit/component_strings.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/webkit_resources.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image.h"
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace wallet {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kLegalDocumentUrl[] =
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "https://wallet.google.com/legaldocument?docId=";
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kPrivacyNoticeUrl[] = "https://wallet.google.com/files/privacy.html";
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(estade): move to base/.
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<class T>
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool VectorsAreEqual(const std::vector<T*>& a, const std::vector<T*>& b) {
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (a.size() != b.size())
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < a.size(); ++i) {
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (*a[i] != *b[i])
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WalletItems::MaskedInstrument::Type
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TypeFromString(const std::string& type_string) {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_string == "VISA")
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::VISA;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_string == "MASTER_CARD")
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::MASTER_CARD;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_string == "AMEX")
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::AMEX;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_string == "DISCOVER")
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::DISCOVER;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_string == "SOLO")
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::SOLO;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_string == "MAESTRO")
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::MAESTRO;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_string == "SWITCH")
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::SWITCH;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return WalletItems::MaskedInstrument::UNKNOWN;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WalletItems::MaskedInstrument::Status
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    StatusFromString(const std::string& status_string) {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status_string == "AMEX_NOT_SUPPORTED")
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::AMEX_NOT_SUPPORTED;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status_string == "PENDING")
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::PENDING;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status_string == "VALID")
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::VALID;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status_string == "DECLINED")
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::DECLINED;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status_string == "DISABLED_FOR_THIS_MERCHANT")
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::DISABLED_FOR_THIS_MERCHANT;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status_string == "UNSUPPORTED_COUNTRY")
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::UNSUPPORTED_COUNTRY;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status_string == "EXPIRED")
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::EXPIRED;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status_string == "BILLING_INCOMPLETE")
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return WalletItems::MaskedInstrument::BILLING_INCOMPLETE;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return WalletItems::MaskedInstrument::INAPPLICABLE;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)base::string16 DisplayStringFromType(WalletItems::MaskedInstrument::Type type) {
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  switch (type) {
88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case WalletItems::MaskedInstrument::AMEX:
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return CreditCard::TypeForDisplay(kAmericanExpressCard);
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case WalletItems::MaskedInstrument::DISCOVER:
91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return CreditCard::TypeForDisplay(kDiscoverCard);
92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case WalletItems::MaskedInstrument::MASTER_CARD:
93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return CreditCard::TypeForDisplay(kMasterCard);
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case WalletItems::MaskedInstrument::VISA:
95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return CreditCard::TypeForDisplay(kVisaCard);
96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    default:
97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return CreditCard::TypeForDisplay(kGenericCard);
98d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // anonymous namespace
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WalletItems::MaskedInstrument::MaskedInstrument(
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16& descriptive_name,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WalletItems::MaskedInstrument::Type& type,
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::vector<base::string16>& supported_currencies,
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16& last_four_digits,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int expiration_month,
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int expiration_year,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<Address> address,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WalletItems::MaskedInstrument::Status& status,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& object_id)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : descriptive_name_(descriptive_name),
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      type_(type),
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      supported_currencies_(supported_currencies),
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      last_four_digits_(last_four_digits),
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      expiration_month_(expiration_month),
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      expiration_year_(expiration_year),
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      address_(address.Pass()),
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      status_(status),
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      object_id_(object_id) {
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DCHECK(address_);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WalletItems::MaskedInstrument::~MaskedInstrument() {}
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<WalletItems::MaskedInstrument>
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WalletItems::MaskedInstrument::CreateMaskedInstrument(
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::DictionaryValue& dictionary) {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string type_string;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Type type;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dictionary.GetString("type", &type_string)) {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    type = TypeFromString(type_string);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DLOG(ERROR) << "Response from Google Wallet missing card type";
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<MaskedInstrument>();
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 last_four_digits;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dictionary.GetString("last_four_digits", &last_four_digits)) {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DLOG(ERROR) << "Response from Google Wallet missing last four digits";
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<MaskedInstrument>();
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string status_string;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Status status;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dictionary.GetString("status", &status_string)) {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    status = StatusFromString(status_string);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DLOG(ERROR) << "Response from Google Wallet missing status";
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<MaskedInstrument>();
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string object_id;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dictionary.GetString("object_id", &object_id)) {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DLOG(ERROR) << "Response from Google Wallet missing object id";
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<MaskedInstrument>();
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::DictionaryValue* address_dict;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dictionary.GetDictionary("billing_address", &address_dict)) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DLOG(ERROR) << "Response from Google wallet missing address";
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<MaskedInstrument>();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Address> address = Address::CreateDisplayAddress(*address_dict);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!address) {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DLOG(ERROR) << "Response from Google wallet contained malformed address";
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<MaskedInstrument>();
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> supported_currencies;
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::ListValue* supported_currency_list;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dictionary.GetList("supported_currency", &supported_currency_list)) {
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < supported_currency_list->GetSize(); ++i) {
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::string16 currency;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (supported_currency_list->GetString(i, &currency))
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        supported_currencies.push_back(currency);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Response from Google Wallet missing supported currency";
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int expiration_month;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dictionary.GetInteger("expiration_month", &expiration_month))
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Response from Google Wallet missing expiration month";
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int expiration_year;
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dictionary.GetInteger("expiration_year", &expiration_year))
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Response from Google Wallet missing expiration year";
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 descriptive_name;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dictionary.GetString("descriptive_name", &descriptive_name))
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Response from Google Wallet missing descriptive name";
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return scoped_ptr<MaskedInstrument>(new MaskedInstrument(descriptive_name,
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           type,
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           supported_currencies,
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           last_four_digits,
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           expiration_month,
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           expiration_year,
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           address.Pass(),
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           status,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           object_id));
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WalletItems::MaskedInstrument::operator==(
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WalletItems::MaskedInstrument& other) const {
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (descriptive_name_ != other.descriptive_name_)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ != other.type_)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (supported_currencies_ != other.supported_currencies_)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (last_four_digits_ != other.last_four_digits_)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (expiration_month_ != other.expiration_month_)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (expiration_year_ != other.expiration_year_)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (address_) {
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (other.address_) {
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (*address_ != *other.address_)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  } else if (other.address_) {
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status_ != other.status_)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (object_id_ != other.object_id_)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WalletItems::MaskedInstrument::operator!=(
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WalletItems::MaskedInstrument& other) const {
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !(*this == other);
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const WalletItems::MaskedInstrument* WalletItems::GetInstrumentById(
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& object_id) const {
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (object_id.empty())
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < instruments_.size(); ++i) {
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (instruments_[i]->object_id() == object_id)
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return instruments_[i];
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NULL;
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool WalletItems::HasRequiredAction(RequiredAction action) const {
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(ActionAppliesToWalletItems(action));
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return std::find(required_actions_.begin(),
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   required_actions_.end(),
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   action) != required_actions_.end();
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool WalletItems::SupportsCard(const base::string16& card_number,
2641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               base::string16* message) const {
2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string card_type = CreditCard::GetCreditCardType(card_number);
2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (card_type == kVisaCard ||
2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      card_type == kMasterCard ||
2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      card_type == kDiscoverCard) {
2701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return true;
2711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (card_type == kAmericanExpressCard) {
2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (amex_permission_ == AMEX_ALLOWED)
2751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return true;
2761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    *message = l10n_util::GetStringUTF16(
2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        IDS_AUTOFILL_CREDIT_CARD_NOT_SUPPORTED_BY_WALLET_FOR_MERCHANT);
2791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  *message = l10n_util::GetStringUTF16(
2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      IDS_AUTOFILL_CREDIT_CARD_NOT_SUPPORTED_BY_WALLET);
2841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   return false;
2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)std::string WalletItems::ObfuscatedGaiaId() const {
288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (active_account_index_ >= gaia_accounts_.size())
289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return std::string();
290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return gaia_accounts_[active_account_index_]->obfuscated_id();
292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::string16 WalletItems::MaskedInstrument::DisplayName() const {
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(aruslan): improve this stub implementation.
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return descriptive_name();
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return descriptive_name();
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::string16 WalletItems::MaskedInstrument::DisplayNameDetail() const {
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(aruslan): improve this stub implementation.
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return address().DisplayName();
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return base::string16();
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::string16 WalletItems::MaskedInstrument::TypeAndLastFourDigits() const {
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(dbeam): i18n.
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return DisplayStringFromType(type_) + base::ASCIIToUTF16(" - ") +
315d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)         last_four_digits();
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const gfx::Image& WalletItems::MaskedInstrument::CardIcon() const {
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int idr = 0;
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type_) {
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case AMEX:
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      idr = IDR_AUTOFILL_CC_AMEX;
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case DISCOVER:
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      idr = IDR_AUTOFILL_CC_DISCOVER;
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case MASTER_CARD:
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      idr = IDR_AUTOFILL_CC_MASTERCARD;
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case VISA:
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      idr = IDR_AUTOFILL_CC_VISA;
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case SOLO:
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case MAESTRO:
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SWITCH:
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case UNKNOWN:
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      idr = IDR_AUTOFILL_CC_GENERIC;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ResourceBundle::GetSharedInstance().GetImageNamed(idr);
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::string16 WalletItems::MaskedInstrument::GetInfo(
3493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    const AutofillType& type,
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& app_locale) const {
3513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (type.group() != CREDIT_CARD)
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return address().GetInfo(type, app_locale);
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
354bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  switch (type.GetStorableType()) {
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CREDIT_CARD_NAME:
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return address().recipient_name();
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CREDIT_CARD_NUMBER:
35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return DisplayName();
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CREDIT_CARD_EXP_4_DIGIT_YEAR:
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::IntToString16(expiration_year());
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CREDIT_CARD_VERIFICATION_CODE:
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
367d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case CREDIT_CARD_TYPE:
368d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return DisplayStringFromType(type_);
369d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return base::string16();
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WalletItems::LegalDocument::~LegalDocument() {}
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<WalletItems::LegalDocument>
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WalletItems::LegalDocument::CreateLegalDocument(
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::DictionaryValue& dictionary) {
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string id;
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!dictionary.GetString("legal_document_id", &id)) {
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DLOG(ERROR) << "Response from Google Wallet missing legal document id";
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<LegalDocument>();
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 display_name;
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dictionary.GetString("display_name", &display_name)) {
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DLOG(ERROR) << "Response from Google Wallet missing display name";
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<LegalDocument>();
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return scoped_ptr<LegalDocument>(new LegalDocument(id, display_name));
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<WalletItems::LegalDocument>
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WalletItems::LegalDocument::CreatePrivacyPolicyDocument() {
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return scoped_ptr<LegalDocument>(new LegalDocument(
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GURL(kPrivacyNoticeUrl),
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PRIVACY_POLICY_LINK)));
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WalletItems::LegalDocument::operator==(const LegalDocument& other) const {
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return id_ == other.id_ &&
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         url_ == other.url_ &&
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         display_name_ == other.display_name_;
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WalletItems::LegalDocument::operator!=(const LegalDocument& other) const {
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !(*this == other);
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WalletItems::LegalDocument::LegalDocument(const std::string& id,
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          const base::string16& display_name)
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : id_(id),
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      url_(kLegalDocumentUrl + id),
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      display_name_(display_name) {}
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WalletItems::LegalDocument::LegalDocument(const GURL& url,
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          const base::string16& display_name)
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : url_(url),
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      display_name_(display_name) {}
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WalletItems::WalletItems(const std::vector<RequiredAction>& required_actions,
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const std::string& google_transaction_id,
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const std::string& default_instrument_id,
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const std::string& default_address_id,
429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                         AmexPermission amex_permission)
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : required_actions_(required_actions),
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      google_transaction_id_(google_transaction_id),
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default_instrument_id_(default_instrument_id),
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default_address_id_(default_address_id),
434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      active_account_index_(std::numeric_limits<size_t>::max()),
435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      amex_permission_(amex_permission) {}
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WalletItems::~WalletItems() {}
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<WalletItems>
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WalletItems::CreateWalletItems(const base::DictionaryValue& dictionary) {
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<RequiredAction> required_action;
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::ListValue* required_action_list;
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dictionary.GetList("required_action", &required_action_list)) {
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < required_action_list->GetSize(); ++i) {
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::string action_string;
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (required_action_list->GetString(i, &action_string)) {
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        RequiredAction action = ParseRequiredActionFromString(action_string);
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!ActionAppliesToWalletItems(action)) {
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          DLOG(ERROR) << "Response from Google wallet with bad required action:"
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         " \"" << action_string << "\"";
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          return scoped_ptr<WalletItems>();
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        required_action.push_back(action);
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Response from Google wallet missing required actions";
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string google_transaction_id;
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dictionary.GetString("google_transaction_id", &google_transaction_id) &&
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      required_action.empty()) {
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DLOG(ERROR) << "Response from Google wallet missing google transaction id";
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<WalletItems>();
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string default_instrument_id;
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dictionary.GetString("default_instrument_id", &default_instrument_id))
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Response from Google wallet missing default instrument id";
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string default_address_id;
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dictionary.GetString("default_address_id", &default_address_id))
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Response from Google wallet missing default_address_id";
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // obfuscated_gaia_id is deprecated.
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
47768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool amex_disallowed = true;
47868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!dictionary.GetBoolean("amex_disallowed", &amex_disallowed))
47968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    DVLOG(1) << "Response from Google wallet missing the amex_disallowed field";
48068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AmexPermission amex_permission =
48168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      amex_disallowed ? AMEX_DISALLOWED : AMEX_ALLOWED;
48268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<WalletItems> wallet_items(new WalletItems(required_action,
484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                       google_transaction_id,
485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                       default_instrument_id,
486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                       default_address_id,
487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                       amex_permission));
488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::vector<std::string> gaia_accounts;
489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const base::ListValue* gaia_profiles;
490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (dictionary.GetList("gaia_profile", &gaia_profiles)) {
491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for (size_t i = 0; i < gaia_profiles->GetSize(); ++i) {
492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const base::DictionaryValue* account_dict;
493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      std::string email;
494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (!gaia_profiles->GetDictionary(i, &account_dict))
495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        continue;
496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      scoped_ptr<GaiaAccount> gaia_account(
498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          GaiaAccount::Create(*account_dict));
499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (gaia_account)
500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        wallet_items->AddAccount(gaia_account.Pass());
501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DVLOG(1) << "Response from Google wallet missing GAIA accounts";
504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::ListValue* legal_docs;
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dictionary.GetList("required_legal_document", &legal_docs)) {
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < legal_docs->GetSize(); ++i) {
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::DictionaryValue* legal_doc_dict;
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (legal_docs->GetDictionary(i, &legal_doc_dict)) {
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scoped_ptr<LegalDocument> legal_doc(
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            LegalDocument::CreateLegalDocument(*legal_doc_dict));
513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (legal_doc)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          wallet_items->AddLegalDocument(legal_doc.Pass());
515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        else
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          return scoped_ptr<WalletItems>();
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!legal_docs->empty()) {
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Always append the privacy policy link as well.
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      wallet_items->AddLegalDocument(
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          LegalDocument::CreatePrivacyPolicyDocument());
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Response from Google wallet missing legal docs";
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::ListValue* instruments;
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dictionary.GetList("instrument", &instruments)) {
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < instruments->GetSize(); ++i) {
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::DictionaryValue* instrument_dict;
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (instruments->GetDictionary(i, &instrument_dict)) {
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scoped_ptr<MaskedInstrument> instrument(
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            MaskedInstrument::CreateMaskedInstrument(*instrument_dict));
536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (instrument)
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          wallet_items->AddInstrument(instrument.Pass());
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Response from Google wallet missing instruments";
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::ListValue* addresses;
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dictionary.GetList("address", &addresses)) {
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < addresses->GetSize(); ++i) {
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::DictionaryValue* address_dict;
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (addresses->GetDictionary(i, &address_dict)) {
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scoped_ptr<Address> address(
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            Address::CreateAddressWithID(*address_dict));
551a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (address)
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          wallet_items->AddAddress(address.Pass());
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Response from Google wallet missing addresses";
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return wallet_items.Pass();
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WalletItems::AddAccount(scoped_ptr<GaiaAccount> account) {
563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (account->index() != gaia_accounts_.size()) {
564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DVLOG(1) << "Tried to add account out of order";
565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
567a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
568a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (account->is_active())
569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    active_account_index_ = account->index();
570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gaia_accounts_.push_back(account.release());
572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
573a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WalletItems::operator==(const WalletItems& other) const {
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return google_transaction_id_ == other.google_transaction_id_ &&
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         default_instrument_id_ == other.default_instrument_id_ &&
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         default_address_id_ == other.default_address_id_ &&
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         required_actions_ == other.required_actions_ &&
579a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)         // This check is technically redundant, but is useful for tests.
580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)         ObfuscatedGaiaId() == other.ObfuscatedGaiaId() &&
581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         active_account_index() == other.active_account_index() &&
582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)         VectorsAreEqual<GaiaAccount>(gaia_accounts(),
583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                      other.gaia_accounts()) &&
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         VectorsAreEqual<MaskedInstrument>(instruments(),
585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                            other.instruments()) &&
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         VectorsAreEqual<Address>(addresses(), other.addresses()) &&
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         VectorsAreEqual<LegalDocument>(legal_documents(),
588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                         other.legal_documents());
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WalletItems::operator!=(const WalletItems& other) const {
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !(*this == other);
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace wallet
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace autofill
597