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