blob: 3923323939745fcb2312107c26cc28a5d3013fa5 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_MENU_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_MENU_VIEW_H_
#include <stddef.h>
#include <map>
#include <memory>
#include <vector>
#include "base/macros.h"
#include "chrome/browser/profiles/avatar_menu.h"
#include "chrome/browser/profiles/avatar_menu_observer.h"
#include "chrome/browser/sync/sync_ui_util.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/views/profiles/profile_menu_view_base.h"
#include "components/signin/core/browser/signin_header_helper.h"
#include "ui/views/controls/styled_label.h"
namespace views {
class Button;
}
class Browser;
// This bubble view is displayed when the user clicks on the avatar button.
// It displays a list of profiles and allows users to switch between profiles.
class ProfileMenuView : public ProfileMenuViewBase, public AvatarMenuObserver {
public:
ProfileMenuView(views::Button* anchor_button,
Browser* browser,
signin_metrics::AccessPoint access_point);
~ProfileMenuView() override;
// ProfileMenuViewBase:
void BuildMenu() override;
private:
friend class ProfileMenuViewExtensionsTest;
// ProfileMenuViewBase:
void FocusButtonOnKeyboardOpen() override;
// views::BubbleDialogDelegateView:
void OnWidgetClosing(views::Widget* widget) override;
base::string16 GetAccessibleWindowTitle() const override;
// Button/link actions.
void OnManageGoogleAccountButtonClicked();
void OnPasswordsButtonClicked();
void OnCreditCardsButtonClicked();
void OnAddressesButtonClicked();
void OnGuestProfileButtonClicked();
void OnManageProfilesButtonClicked();
void OnLockButtonClicked();
void OnExitProfileButtonClicked();
void OnSyncSettingsButtonClicked();
void OnSyncErrorButtonClicked(sync_ui_util::AvatarSyncErrorType error);
void OnCurrentProfileCardClicked();
void OnSigninButtonClicked();
void OnSigninAccountButtonClicked(AccountInfo account);
void OnSignoutButtonClicked();
void OnOtherProfileSelected(const base::FilePath& profile_path);
void OnCookiesClearedOnExitLinkClicked();
void OnAddNewProfileButtonClicked();
// AvatarMenuObserver:
void OnAvatarMenuChanged(AvatarMenu* avatar_menu) override;
// We normally close the bubble any time it becomes inactive but this can lead
// to flaky tests where unexpected UI events are triggering this behavior.
// Tests set this to "false" for more consistent operation.
static bool close_on_deactivate_for_testing_;
// Helper methods for building the menu.
void BuildIdentity();
void BuildGuestIdentity();
gfx::ImageSkia GetSyncIcon();
void BuildAutofillButtons();
void BuildSyncInfo();
void BuildFeatureButtons();
void BuildProfileManagementHeading();
void BuildSelectableProfiles();
void BuildProfileManagementFeatureButtons();
// Adds the profile chooser view.
void AddProfileMenuView(AvatarMenu* avatar_menu);
// Adds the main profile card for the profile |avatar_item|. |is_guest| is
// used to determine whether to show any Sign in/Sign out/Manage accounts
// links.
void AddCurrentProfileView(const AvatarMenu::Item& avatar_item,
bool is_guest);
void AddGuestProfileView();
void AddOptionsView(bool display_lock, AvatarMenu* avatar_menu);
void AddSupervisedUserDisclaimerView();
void AddAutofillHomeView();
#if defined(GOOGLE_CHROME_BUILD)
void AddManageGoogleAccountButton();
#endif
// Adds the DICE UI view to sign in and turn on sync. It includes an
// illustration, a promo and a button.
void AddDiceSigninView();
// Adds a header for signin and sync error surfacing for the user menu.
// Returns true if header is created.
bool AddSyncErrorViewIfNeeded(const AvatarMenu::Item& avatar_item);
// Adds a view showing a sync error and an error button, when dice is not
// enabled.
void AddPreDiceSyncErrorView(const AvatarMenu::Item& avatar_item,
sync_ui_util::AvatarSyncErrorType error,
int button_string_id,
int content_string_id);
// Adds a view showing the profile associated with |avatar_item| and an error
// button below, when dice is enabled.
void AddDiceSyncErrorView(const AvatarMenu::Item& avatar_item,
sync_ui_util::AvatarSyncErrorType error,
int button_string_id);
// Add a view showing that the reason for the sync paused is in the cookie
// settings setup. On click, will direct to the cookie settings page.
void AddSyncPausedReasonCookiesClearedOnExit();
// Adds a promo for signin, if dice is not enabled.
void AddPreDiceSigninPromo();
// Adds a promo for signin, if dice is enabled.
void AddDiceSigninPromo();
// Clean-up done after an action was performed in the ProfileChooser.
void PostActionPerformed(ProfileMetrics::ProfileDesktopMenu action_performed);
// Methods to keep track of the number of times the Dice sign-in promo has
// been shown.
int GetDiceSigninPromoShowCount() const;
void IncrementDiceSigninPromoShowCount();
std::unique_ptr<AvatarMenu> avatar_menu_;
// Button pointers used in tests.
views::Button* first_profile_button_ = nullptr;
views::Button* lock_button_ = nullptr;
// The current access point of sign in.
const signin_metrics::AccessPoint access_point_;
// Dice accounts used in the sync promo.
std::vector<AccountInfo> dice_accounts_;
const bool dice_enabled_;
DISALLOW_COPY_AND_ASSIGN(ProfileMenuView);
};
#endif // CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_MENU_VIEW_H_