one_click_signin_bubble_view.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/sync/one_click_signin_bubble_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_helpers.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google/google_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/theme_resources.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ui_resources.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/image_button.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/text_button.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/image_view.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/link.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Minimum width for the mutli-line label.
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kMinimumDialogLabelWidth = 400;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMinimumLabelWidth = 240;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kDialogMargin = 16;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The column set constants that can be used in the InitContent() function
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to layout views.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum OneClickSigninBubbleColumnTypes {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COLUMN_SET_FILL_ALIGN,
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COLUMN_SET_CONTROLS,
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COLUMN_SET_TITLE_BAR
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OneClickSigninDialogView : public OneClickSigninBubbleView {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OneClickSigninDialogView(
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::WebContents* web_content,
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::View* anchor_view,
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const BrowserWindow::StartSyncCallback& start_sync_callback);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::WidgetDelegate:
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ui::ModalType GetModalType() const OVERRIDE;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from OneClickSigninBubbleView:
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InitContent(views::GridLayout* layout) OVERRIDE;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetButtons(views::TextButton** ok_button,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          views::TextButton** undo_button) OVERRIDE;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual views::Link* GetAdvancedLink() OVERRIDE;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::LinkListener:
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents* web_content_;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Link* learn_more_link_;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::ImageButton* close_button_;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OneClickSigninDialogView);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OneClickSigninDialogView::OneClickSigninDialogView(
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* web_content,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::View* anchor_view,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const BrowserWindow::StartSyncCallback& start_sync_callback)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : OneClickSigninBubbleView(anchor_view, start_sync_callback),
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_content_(web_content),
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      learn_more_link_(NULL),
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      close_button_(NULL) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_arrow_location(views::BubbleBorder::NONE);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_anchor_insets(gfx::Insets(0, 0, anchor_view->height() / 2, 0));
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_close_on_deactivate(false);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_margins(gfx::Insets(kDialogMargin, kDialogMargin, kDialogMargin,
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          kDialogMargin));
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::ModalType OneClickSigninDialogView::GetModalType() const {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ui::MODAL_TYPE_CHILD;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OneClickSigninDialogView::InitContent(views::GridLayout* layout) {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Column set for title bar.
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_TITLE_BAR);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                views::GridLayout::USE_PREF, 0, 0);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                views::GridLayout::USE_PREF, 0, 0);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layout->StartRow(0, COLUMN_SET_TITLE_BAR);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Label* label = new views::Label(
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE));
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    label->SetFont(label->font().DeriveFont(3, gfx::Font::BOLD));
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layout->AddView(label);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    close_button_ = new views::ImageButton(this);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    close_button_->SetImage(views::ImageButton::STATE_NORMAL,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            rb.GetImageNamed(IDR_CLOSE_BAR).ToImageSkia());
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    close_button_->SetImage(views::ImageButton::STATE_HOVERED,
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            rb.GetImageNamed(IDR_CLOSE_BAR_H).ToImageSkia());
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    close_button_->SetImage(views::ImageButton::STATE_PRESSED,
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            rb.GetImageNamed(IDR_CLOSE_BAR_P).ToImageSkia());
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layout->AddView(close_button_);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layout->StartRow(0, COLUMN_SET_FILL_ALIGN);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Label* label = new views::Label(
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE));
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    label->SetMultiLine(true);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    label->SizeToFit(kMinimumDialogLabelWidth);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layout->AddView(label);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layout->StartRow(0, COLUMN_SET_FILL_ALIGN);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    learn_more_link_ = new views::Link(
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_LEARN_MORE));
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    learn_more_link_->set_listener(this);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    learn_more_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layout->AddView(learn_more_link_, 1, 1, views::GridLayout::TRAILING,
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    views::GridLayout::CENTER);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OneClickSigninDialogView::GetButtons(views::TextButton** ok_button,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          views::TextButton** undo_button) {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *ok_button = new views::NativeTextButton(this);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *undo_button = new views::NativeTextButton(this);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The default size of the buttons is too large.  To allow them to be smaller
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ignore the minimum default size.  Furthermore, to make sure they are the
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // same size, SetText() is called with both strings on both buttons.
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (*ok_button)->set_ignore_minimum_size(true);
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (*undo_button)->set_ignore_minimum_size(true);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 ok_label =
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_OK_BUTTON);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 undo_label =
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_UNDO_BUTTON);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (*ok_button)->SetText(undo_label);
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (*ok_button)->SetText(ok_label);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (*undo_button)->SetText(ok_label);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (*undo_button)->SetText(undo_label);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::Link* OneClickSigninDialogView::GetAdvancedLink() {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Link* advanced_link= new views::Link(
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_ADVANCED));
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  advanced_link->set_listener(this);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  advanced_link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return advanced_link;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OneClickSigninDialogView::LinkClicked(views::Link* source,
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           int event_flags) {
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (source == learn_more_link_) {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::OpenURLParams params(
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GURL(chrome::kChromeSyncLearnMoreURL), content::Referrer(),
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NEW_WINDOW, content::PAGE_TRANSITION_LINK, false);
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_content_->OpenURL(params);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OneClickSigninBubbleView::LinkClicked(source, event_flags);
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OneClickSigninBubbleView ----------------------------------------------------
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OneClickSigninBubbleView* OneClickSigninBubbleView::bubble_view_ = NULL;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::ShowBubble(
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserWindow::OneClickSigninBubbleType type,
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ToolbarView* toolbar_view,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BrowserWindow::StartSyncCallback& start_sync) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsShowing())
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bubble_view_ = type == BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE ?
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new OneClickSigninBubbleView(toolbar_view->app_menu(), start_sync) :
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new OneClickSigninDialogView(toolbar_view->GetWebContents(),
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   toolbar_view->location_bar(), start_sync);
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::BubbleDelegateView::CreateBubble(bubble_view_)->Show();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OneClickSigninBubbleView::IsShowing() {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bubble_view_ != NULL;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::Hide() {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsShowing())
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bubble_view_->GetWidget()->Close();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OneClickSigninBubbleView::OneClickSigninBubbleView(
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View* anchor_view,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BrowserWindow::StartSyncCallback& start_sync_callback)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT),
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      advanced_link_(NULL),
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ok_button_(NULL),
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      undo_button_(NULL),
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      start_sync_callback_(start_sync_callback),
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      message_loop_for_testing_(NULL) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!start_sync_callback_.is_null());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OneClickSigninBubbleView::~OneClickSigninBubbleView() {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::AnimationEnded(const ui::Animation* animation) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::BubbleDelegateView::AnimationEnded(animation);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (message_loop_for_testing_)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_for_testing_->Quit();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::Init() {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::GridLayout* layout = new views::GridLayout(this);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLayoutManager(layout);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_border(views::Border::CreateEmptyBorder(8, 8, 8, 8));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Column set for descriptive text and link.
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_FILL_ALIGN);
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cs->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 1,
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                views::GridLayout::USE_PREF, 0, 0);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Column set for buttons at bottom of bubble.
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cs = layout->AddColumnSet(COLUMN_SET_CONTROLS);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                views::GridLayout::USE_PREF, 0, 0);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                views::GridLayout::USE_PREF, 0, 0);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                views::GridLayout::USE_PREF, 0, 0);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitContent(layout);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add controls at the bottom.
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  advanced_link_= GetAdvancedLink();
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetButtons(&ok_button_, &undo_button_);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ok_button_->SetIsDefault(true);
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->StartRow(0, COLUMN_SET_CONTROLS);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->AddView(advanced_link_);
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->AddView(ok_button_);
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->AddView(undo_button_);
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, 0));
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OneClickSigninBubbleView::InitContent(views::GridLayout* layout) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add main text description.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Label* label = new views::Label(
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_BUBBLE_MESSAGE));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label->SetMultiLine(true);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label->SizeToFit(kMinimumLabelWidth);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->StartRow(0, COLUMN_SET_FILL_ALIGN);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(label);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OneClickSigninBubbleView::GetButtons(views::TextButton** ok_button,
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          views::TextButton** undo_button) {
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *ok_button = new views::NativeTextButton(this);
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *undo_button = new views::NativeTextButton(this);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The default size of the buttons is too large.  To allow them to be smaller
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ignore the minimum default size.  Furthermore, to make sure they are the
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // same size, SetText() is called with both strings on both buttons.
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (*ok_button)->set_ignore_minimum_size(true);
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (*undo_button)->set_ignore_minimum_size(true);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 ok_label = l10n_util::GetStringUTF16(IDS_OK);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 undo_label = l10n_util::GetStringUTF16(IDS_ONE_CLICK_BUBBLE_UNDO);
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (*ok_button)->SetText(undo_label);
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (*ok_button)->SetText(ok_label);
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (*undo_button)->SetText(ok_label);
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (*undo_button)->SetText(undo_label);
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::Link* OneClickSigninBubbleView::GetAdvancedLink() {
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Link* advanced_link= new views::Link(
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_SYNC_PROMO_NTP_BUBBLE_ADVANCED));
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  advanced_link->set_listener(this);
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  advanced_link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return advanced_link;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::WindowClosing() {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We have to reset |bubble_view_| here, not in our destructor, because
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we'll be destroyed asynchronously and the shown state will be checked
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before then.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(bubble_view_, this);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bubble_view_ = NULL;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!start_sync_callback_.is_null()) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ResetAndReturn(&start_sync_callback_).Run(
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OneClickSigninBubbleView::AcceleratorPressed(
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator& accelerator) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (accelerator.key_code() == ui::VKEY_RETURN ||
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      accelerator.key_code() == ui::VKEY_ESCAPE) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StartFade(false);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (accelerator.key_code() == ui::VKEY_RETURN) {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::ResetAndReturn(&start_sync_callback_).Run(
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      start_sync_callback_.Reset();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BubbleDelegateView::AcceleratorPressed(accelerator);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::LinkClicked(views::Link* source,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int event_flags) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartFade(false);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ResetAndReturn(&start_sync_callback_).Run(
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::ButtonPressed(views::Button* sender,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const ui::Event& event) {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartFade(false);
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ResetAndReturn(&start_sync_callback_).Run((sender == ok_button_) ?
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS :
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OneClickSigninSyncStarter::UNDO_SYNC);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
363