account_chooser_model.h revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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 PrefService;
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 account chooser UI needs to be updated.
37  virtual void UpdateAccountChooserView() = 0;
38};
39
40// A menu model for the account chooser. This allows users to switch between
41// Online Wallet accounts and local Autofill data.
42// Terminology:
43// - "Active Wallet account": the account used for communications with the
44// Online Wallet service. There may be multiple signed-in accounts, but at any
45// point of time at most one of is active.
46class AccountChooserModel : public ui::SimpleMenuModel,
47                            public ui::SimpleMenuModel::Delegate {
48 public:
49  AccountChooserModel(AccountChooserModelDelegate* delegate,
50                      PrefService* prefs,
51                      const AutofillMetrics& metric_logger);
52  virtual ~AccountChooserModel();
53
54  // ui::SimpleMenuModel implementation.
55  virtual void MenuWillShow() OVERRIDE;
56
57  // ui::SimpleMenuModel::Delegate implementation.
58  virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
59  virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
60  virtual bool GetAcceleratorForCommandId(
61      int command_id,
62      ui::Accelerator* accelerator) OVERRIDE;
63  virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
64  virtual void MenuWillShow(ui::SimpleMenuModel* source) OVERRIDE;
65
66  // Sets the selection to the currently active Online Wallet account.
67  // Should be called if the user attempts to sign into the Online Wallet
68  // (e.g. when the user clicks the "Sign-in" link).
69  void SelectActiveWalletAccount();
70
71  // Sets the selection to the local Autofill data.
72  void SelectUseAutofill();
73
74  // Returns true if there are any accounts for the user to choose from.
75  bool HasAccountsToChoose() const;
76
77  // Sets the name of the accounts used to communicate with the Online Wallet.
78  void SetWalletAccounts(const std::vector<std::string>& accounts);
79
80  // Clears the set of accounts used to communicate with the Online Wallet.
81  // Any Wallet error automatically clears the currently active account name.
82  void ClearWalletAccounts();
83
84  // Returns the name of the currently active account, or an empty string.
85  // The currently active account may not be the checked item in the menu, but
86  // will be the most recently checked wallet account item.
87  base::string16 GetActiveWalletAccountName() const;
88
89  // Returns the index of the account that is currently active.
90  size_t GetActiveWalletAccountIndex() const;
91
92  // Disables all Wallet accounts and switches to the local Autofill data.
93  // Should be called when the Wallet server returns an error.
94  void SetHadWalletError();
95
96  // Switches the dialog to the local Autofill data.
97  // Should be called when the Online Wallet sign-in attempt has failed.
98  void SetHadWalletSigninError();
99
100  // Returns true if the selected account is an Online Wallet account.
101  bool WalletIsSelected() const;
102
103  // Returns the command id of the current selection.
104  int checked_item() const { return checked_item_; }
105
106 protected:
107  // Command IDs of the items in this menu; protected for the tests.
108  // kAutofillItemId is "Pay without the Wallet" (local autofill data).
109  static const int kAutofillItemId;
110  // Wallet account menu item IDs are this value + the account index.
111  static const int kWalletAccountsStartId;
112
113 private:
114  // Reconstructs the set of menu items.
115  void ReconstructMenuItems();
116
117  AccountChooserModelDelegate* delegate_;
118
119  // The command id of the currently selected item.
120  int checked_item_;
121
122  // The index of the active wallet account.
123  size_t active_wallet_account_;
124
125  // Whether there has been a Wallet error.
126  bool had_wallet_error_;
127
128  // For logging UMA metrics.
129  const AutofillMetrics& metric_logger_;
130
131  // The names (emails) of the signed in accounts, gotten from the
132  // Online Wallet service.
133  std::vector<std::string> wallet_accounts_;
134
135  DISALLOW_COPY_AND_ASSIGN(AccountChooserModel);
136};
137
138}  // namespace autofill
139
140#endif  // CHROME_BROWSER_UI_AUTOFILL_ACCOUNT_CHOOSER_MODEL_H_
141