Home | History | Annotate | Download | only in autofill
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_UI_AUTOFILL_ACCOUNT_CHOOSER_MODEL_H_
      6 #define CHROME_BROWSER_UI_AUTOFILL_ACCOUNT_CHOOSER_MODEL_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/compiler_specific.h"
     13 #include "base/strings/string16.h"
     14 #include "components/autofill/core/browser/autofill_manager_delegate.h"
     15 #include "ui/base/models/simple_menu_model.h"
     16 
     17 class AutofillMetrics;
     18 class Profile;
     19 
     20 namespace autofill {
     21 
     22 class AccountChooserModel;
     23 
     24 // A delegate interface to allow the AccountChooserModel to inform its owner
     25 // of changes.
     26 class AccountChooserModelDelegate {
     27  public:
     28   virtual ~AccountChooserModelDelegate();
     29 
     30   // Called right before the account chooser is shown.
     31   virtual void AccountChooserWillShow() = 0;
     32 
     33   // Called when the active account has changed.
     34   virtual void AccountChoiceChanged() = 0;
     35 
     36   // Called when the user selects the "add account" menu item.
     37   virtual void AddAccount() = 0;
     38 
     39   // Called when the account chooser UI needs to be updated.
     40   virtual void UpdateAccountChooserView() = 0;
     41 };
     42 
     43 // A menu model for the account chooser. This allows users to switch between
     44 // Online Wallet accounts and local Autofill data.
     45 // Terminology:
     46 // - "Active Wallet account": the account used for communications with the
     47 // Online Wallet service. There may be multiple signed-in accounts, but at any
     48 // point of time at most one of is active.
     49 class AccountChooserModel : public ui::SimpleMenuModel,
     50                             public ui::SimpleMenuModel::Delegate {
     51  public:
     52   // |disable_wallet| overrides the starting value, which is normally set by a
     53   // pref.
     54   AccountChooserModel(AccountChooserModelDelegate* delegate,
     55                       Profile* profile,
     56                       bool disable_wallet,
     57                       const AutofillMetrics& metric_logger);
     58   virtual ~AccountChooserModel();
     59 
     60   // ui::SimpleMenuModel implementation.
     61   virtual void MenuWillShow() OVERRIDE;
     62 
     63   // ui::SimpleMenuModel::Delegate implementation.
     64   virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
     65   virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
     66   virtual bool GetAcceleratorForCommandId(
     67       int command_id,
     68       ui::Accelerator* accelerator) OVERRIDE;
     69   virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
     70   virtual void MenuWillShow(ui::SimpleMenuModel* source) OVERRIDE;
     71 
     72   // Sets the selection to the given wallet account.
     73   void SelectWalletAccount(size_t user_index);
     74 
     75   // Sets the selection to the local Autofill data.
     76   void SelectUseAutofill();
     77 
     78   // Returns true if there are any accounts for the user to choose from.
     79   bool HasAccountsToChoose() const;
     80 
     81   // Sets the name of the accounts used to communicate with the Online Wallet
     82   // and switches |checked_item_| to point to the menu item for the account.
     83   void SetWalletAccounts(const std::vector<std::string>& accounts,
     84                          size_t active_index);
     85 
     86   // Clears the set of accounts used to communicate with the Online Wallet.
     87   // Any Wallet error automatically clears the currently active account name.
     88   void ClearWalletAccounts();
     89 
     90   // Returns the name of the currently active account, or an empty string.
     91   // The currently active account may not be the checked item in the menu, but
     92   // will be the most recently checked wallet account item.
     93   base::string16 GetActiveWalletAccountName() const;
     94 
     95   // Returns the index of the account that is currently active.
     96   size_t GetActiveWalletAccountIndex() const;
     97 
     98   // Disables all Wallet accounts and switches to the local Autofill data.
     99   // Should be called when the Wallet server returns an error.
    100   void SetHadWalletError();
    101 
    102   // Switches the dialog to the local Autofill data.
    103   // Should be called when the Online Wallet sign-in attempt has failed.
    104   void SetHadWalletSigninError();
    105 
    106   // Returns true if the selected account is an Online Wallet account.
    107   bool WalletIsSelected() const;
    108 
    109  protected:
    110   // Command IDs of the items in this menu; protected for the tests.
    111   // The menu item for adding a new wallet account (for multilogin).
    112   static const int kWalletAddAccountId;
    113   // kAutofillItemId is "Pay without the Wallet" (local autofill data).
    114   static const int kAutofillItemId;
    115   // Wallet account menu item IDs are this value + the account index.
    116   static const int kWalletAccountsStartId;
    117 
    118  private:
    119   // Reconstructs the set of menu items.
    120   void ReconstructMenuItems();
    121 
    122   AccountChooserModelDelegate* delegate_;
    123 
    124   // The command id of the currently selected item.
    125   int checked_item_;
    126 
    127   // Whether there has been a Wallet error.
    128   bool had_wallet_error_;
    129 
    130   // For logging UMA metrics.
    131   const AutofillMetrics& metric_logger_;
    132 
    133   // The names (emails) of the signed in accounts, gotten from the
    134   // Online Wallet service.
    135   std::vector<std::string> wallet_accounts_;
    136 
    137   DISALLOW_COPY_AND_ASSIGN(AccountChooserModel);
    138 };
    139 
    140 }  // namespace autofill
    141 
    142 #endif  // CHROME_BROWSER_UI_AUTOFILL_ACCOUNT_CHOOSER_MODEL_H_
    143