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