• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_client.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 when the active account has changed.
31   virtual void AccountChoiceChanged() = 0;
32 
33   // Called when the user selects the "add account" menu item.
34   virtual void AddAccount() = 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.
46 class AccountChooserModel : public ui::SimpleMenuModel,
47                             public ui::SimpleMenuModel::Delegate {
48  public:
49   // |disable_wallet| overrides the starting value, which is normally set by a
50   // pref.
51   AccountChooserModel(AccountChooserModelDelegate* delegate,
52                       Profile* profile,
53                       bool disable_wallet,
54                       const AutofillMetrics& metric_logger);
55   virtual ~AccountChooserModel();
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 
65   // Sets the selection to the given wallet account.
66   void SelectWalletAccount(size_t user_index);
67 
68   // Sets the selection to the local Autofill data.
69   void SelectUseAutofill();
70 
71   // Returns true if there are any accounts for the user to choose from.
72   bool HasAccountsToChoose() const;
73 
74   // Sets the name of the accounts used to communicate with the Online Wallet
75   // and switches |checked_item_| to point to the menu item for the account.
76   void SetWalletAccounts(const std::vector<std::string>& accounts,
77                          size_t active_index);
78 
79   // Clears the set of accounts used to communicate with the Online Wallet.
80   // Any Wallet error automatically clears the currently active account name.
81   void ClearWalletAccounts();
82 
83   // Returns the name of the currently active account, or an empty string.
84   // The currently active account may not be the checked item in the menu, but
85   // will be the most recently checked wallet account item.
86   base::string16 GetActiveWalletAccountName() const;
87 
88   // Returns the index of the account that is currently active.
89   size_t GetActiveWalletAccountIndex() const;
90 
91   // Disables all Wallet accounts and switches to the local Autofill data.
92   // Should be called when the Wallet server returns an error.
93   void SetHadWalletError();
94 
95   // Switches the dialog to the local Autofill data.
96   // Should be called when the Online Wallet sign-in attempt has failed.
97   void SetHadWalletSigninError();
98 
99   // Returns true if the selected account is an Online Wallet account.
100   bool WalletIsSelected() const;
101 
102  protected:
103   // Command IDs of the items in this menu; protected for the tests.
104   // The menu item for adding a new wallet account (for multilogin).
105   static const int kWalletAddAccountId;
106   // kAutofillItemId is "Pay without the Wallet" (local autofill data).
107   static const int kAutofillItemId;
108   // Wallet account menu item IDs are this value + the account index.
109   static const int kWalletAccountsStartId;
110 
111  private:
112   // Reconstructs the set of menu items.
113   void ReconstructMenuItems();
114 
115   // Switches to the account option represented by |command_id|.
116   void DoAccountSwitch(int command_id);
117 
118   AccountChooserModelDelegate* delegate_;
119 
120   // The command id of the currently selected item.
121   int checked_item_;
122 
123   // Whether there has been a Wallet error.
124   bool had_wallet_error_;
125 
126   // For logging UMA metrics.
127   const AutofillMetrics& metric_logger_;
128 
129   // The names (emails) of the signed in accounts, gotten from the
130   // Online Wallet service.
131   std::vector<std::string> wallet_accounts_;
132 
133   DISALLOW_COPY_AND_ASSIGN(AccountChooserModel);
134 };
135 
136 }  // namespace autofill
137 
138 #endif  // CHROME_BROWSER_UI_AUTOFILL_ACCOUNT_CHOOSER_MODEL_H_
139