account_chooser_model.h revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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
17class AutofillMetrics;
18class Profile;
19
20namespace autofill {
21
22class AccountChooserModel;
23
24// A delegate interface to allow the AccountChooserModel to inform its owner
25// of changes.
26class 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.
49class 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