one_click_signin_bubble_view.h revision a36e5920737c6adbddd3e43b760e5de8431db6e0
1bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Use of this source code is governed by a BSD-style license that can be
3bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// found in the LICENSE file.
4bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
5bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#ifndef CHROME_BROWSER_UI_VIEWS_SYNC_ONE_CLICK_SIGNIN_BUBBLE_VIEW_H_
6bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define CHROME_BROWSER_UI_VIEWS_SYNC_ONE_CLICK_SIGNIN_BUBBLE_VIEW_H_
7bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
8bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "base/basictypes.h"
9bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "base/callback.h"
10bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "base/compiler_specific.h"
11bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "base/gtest_prod_util.h"
12bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "base/memory/scoped_ptr.h"
13bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "base/strings/string16.h"
14bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "chrome/browser/ui/browser_window.h"
15bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "chrome/browser/ui/sync/one_click_signin_bubble_delegate.h"
16bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "ui/views/bubble/bubble_delegate.h"
17bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "ui/views/controls/button/button.h"
18bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "ui/views/controls/link_listener.h"
19bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
20bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonnamespace base {
21bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonclass MessageLoop;
22bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson}
23bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
24bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonnamespace views {
25bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonclass GridLayout;
26bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonclass ImageButton;
27bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonclass LabelButton;
28bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonclass View;
29bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson}
30bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
31bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// OneClickSigninBubbleView is a view intended to be used as the content of an
32bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Bubble. It provides simple and concise feedback to the user that sync'ing
33bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// has started after using the one-click singin infobar.
34bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonclass OneClickSigninBubbleView : public views::BubbleDelegateView,
35bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                                 public views::LinkListener,
36bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                                 public views::ButtonListener {
37bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson public:
38bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Show the one-click signin bubble if not already showing.  The bubble
39bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // will be placed visually beneath |anchor_view|.  |start_sync| is called
40bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // to start sync.
41bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  static void ShowBubble(BrowserWindow::OneClickSigninBubbleType type,
42bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                         const string16& email,
43bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                         const string16& error_message,
44bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                         scoped_ptr<OneClickSigninBubbleDelegate> delegate,
45bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                         views::View* anchor_view,
46bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                         const BrowserWindow::StartSyncCallback& start_sync);
47bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
48bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  static bool IsShowing();
49bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
50bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  static void Hide();
51bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
52bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Gets the global bubble view.  If its not showing returns NULL.  This
53bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // method is meant to be called only from tests.
54bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  static OneClickSigninBubbleView* view_for_testing() { return bubble_view_; }
55bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
56bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson protected:
57bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Creates a OneClickSigninBubbleView.
58bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  OneClickSigninBubbleView(
59bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      const string16& error_message,
60bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      const string16& email,
61bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      scoped_ptr<OneClickSigninBubbleDelegate> delegate,
62bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      views::View* anchor_view,
63bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      const BrowserWindow::StartSyncCallback& start_sync_callback,
64bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      bool is_sync_dialog);
65bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
66bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  virtual ~OneClickSigninBubbleView();
67bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
68bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson private:
69bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  friend class OneClickSigninBubbleViewTest;
70bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
71bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  FRIEND_TEST_ALL_PREFIXES(OneClickSigninBubbleViewTest, BubbleOkButton);
72bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  FRIEND_TEST_ALL_PREFIXES(OneClickSigninBubbleViewTest, DialogOkButton);
73bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  FRIEND_TEST_ALL_PREFIXES(OneClickSigninBubbleViewTest, DialogUndoButton);
74bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  FRIEND_TEST_ALL_PREFIXES(OneClickSigninBubbleViewTest, BubbleAdvancedLink);
75bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  FRIEND_TEST_ALL_PREFIXES(OneClickSigninBubbleViewTest, DialogAdvancedLink);
76bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  FRIEND_TEST_ALL_PREFIXES(OneClickSigninBubbleViewTest, BubbleLearnMoreLink);
77bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  FRIEND_TEST_ALL_PREFIXES(OneClickSigninBubbleViewTest, DialogLearnMoreLink);
78bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
79bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Overridden from views::BubbleDelegateView:
80bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE;
81bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  virtual void Init() OVERRIDE;
82bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
83bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Overridden from views::LinkListener:
84bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
85bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
86bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Overridden from views::ButtonListener:
87bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  virtual void ButtonPressed(views::Button* sender,
88bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                             const ui::Event& event) OVERRIDE;
89bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
90bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Overridden from views::View:
91bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE;
92bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
93bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Overridden from views::WidgetDelegate:
94bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  virtual void WindowClosing() OVERRIDE;
95bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  virtual ui::ModalType GetModalType() const OVERRIDE;
96bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
97bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Builds a popup bubble anchored under the wrench menu
98bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  void InitBubbleContent(views::GridLayout* layout);
99bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
100bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Builds a modal dialog aligned center top
101bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  void InitDialogContent(views::GridLayout* layout);
102bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
103bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Initializes the OK/Undo buttons to be used at the bottom of the bubble.
104bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  void InitButtons(views::GridLayout* layout);
105bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  void GetButtons(views::LabelButton** ok_button,
106bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                          views::LabelButton** undo_button);
107bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
108bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Creates learn more link to be used at the bottom of the bubble.
109bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  void InitLearnMoreLink();
110bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
111bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Creates advanced link to be used at the bottom of the bubble.
112bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  void InitAdvancedLink();
113bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
114bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Delegate to handle clicking on links in the bubble.
115bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  scoped_ptr<OneClickSigninBubbleDelegate> delegate_;
116bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
117bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Alternate error message to be displayed.
118bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  const string16 error_message_;
119bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
120bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // The user's email address to be used for sync.
121bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  const string16 email_;
122bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
123bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // This callback is nulled once its called, so that it is called only once.
124bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // It will be called when the bubble is closed if it has not been called
125bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // and nulled earlier.
126bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  BrowserWindow::StartSyncCallback start_sync_callback_;
127bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
128bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  const bool is_sync_dialog_;
129bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
130bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Link to sync setup advanced page.
131bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  views::Link* advanced_link_;
132bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
133bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Link to the Learn More details page
134bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  views::Link* learn_more_link_;
135bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
136bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Controls at bottom of bubble.
137bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  views::LabelButton* ok_button_;
138bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  views::LabelButton* undo_button_;
139bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
140bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // Close button for the modal dialog
141bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  views::ImageButton* close_button_;
142bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
143bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  bool clicked_learn_more_;
144bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
145bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // A message loop used only with unit tests.
146bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  base::MessageLoop* message_loop_for_testing_;
147bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
148bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  // The bubble, if we're showing one.
149bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  static OneClickSigninBubbleView* bubble_view_;
150bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
151bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  DISALLOW_COPY_AND_ASSIGN(OneClickSigninBubbleView);
152bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson};
153bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
154bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#endif  // CHROME_BROWSER_UI_VIEWS_SYNC_ONE_CLICK_SIGNIN_BUBBLE_VIEW_H_
155bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson