1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/take_photo_view.h"
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/utf_string_conversions.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/helper.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/generated_resources.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/theme_resources.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "skia/ext/image_operations.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/l10n/l10n_util.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/resource/resource_bundle.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/gfx/canvas.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/background.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/border.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/button/image_button.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/image_view.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/label.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/throbber.h"
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/layout/grid_layout.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace {
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Padding between horizontally neighboring elements.
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst int kHorizontalPadding = 10;
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Padding between vertically neighboring elements.
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst int kVerticalPadding = 10;
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Color of image view border.
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst SkColor kImageBorderColor = SkColorSetARGB(38, 0, 0, 0);
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// IDs of column sets for grid layout manager.
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenenum ColumnSets {
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  kTitleRow,    // Column set for screen title.
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  kImageRow,    // Column set for image from camera and snapshot button.
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace chromeos {
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Image view that can show center throbber above itself or a message at its
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// bottom.
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass CameraImageView : public views::ImageView {
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CameraImageView()
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      : throbber_(NULL),
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        message_(NULL) {}
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ~CameraImageView() {}
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void Init() {
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(NULL == throbber_);
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(NULL == message_);
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    set_border(views::Border::CreateSolidBorder(1, kImageBorderColor));
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    set_background(views::Background::CreateSolidBackground(SK_ColorWHITE));
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    throbber_ = CreateDefaultSmoothedThrobber();
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    throbber_->SetVisible(false);
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddChildView(throbber_);
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    message_ = new views::Label();
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    message_->SetMultiLine(true);
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    message_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    message_->SetVisible(false);
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CorrectLabelFontSize(message_);
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddChildView(message_);
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetInitializingState() {
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ShowThrobber();
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetMessage(std::wstring());
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetImage(
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ResourceBundle::GetSharedInstance().GetBitmapNamed(
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            IDR_USER_IMAGE_INITIALIZING));
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetNormalState() {
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    HideThrobber();
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetMessage(std::wstring());
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetErrorState() {
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    HideThrobber();
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetMessage(UTF16ToWide(l10n_util::GetStringUTF16(IDS_USER_IMAGE_NO_VIDEO)));
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetImage(
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ResourceBundle::GetSharedInstance().GetBitmapNamed(
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            IDR_USER_IMAGE_NO_VIDEO));
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void ShowThrobber() {
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(throbber_);
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    throbber_->SetVisible(true);
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    throbber_->Start();
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HideThrobber() {
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(throbber_);
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    throbber_->Stop();
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    throbber_->SetVisible(false);
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetMessage(const std::wstring& message) {
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(message_);
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    message_->SetText(message);
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    message_->SetVisible(!message.empty());
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Layout();
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // views::View override:
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Layout() {
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    gfx::Size size = GetPreferredSize();
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (throbber_->IsVisible()) {
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      gfx::Size throbber_size = throbber_->GetPreferredSize();
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      int throbber_x = (size.width() - throbber_size.width()) / 2;
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      int throbber_y = (size.height() - throbber_size.height()) / 2;
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      throbber_->SetBounds(throbber_x,
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           throbber_y,
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           throbber_size.width(),
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           throbber_size.height());
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (message_->IsVisible()) {
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      message_->SizeToFit(size.width() - kHorizontalPadding * 2);
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      gfx::Size message_size = message_->GetPreferredSize();
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      int message_y = size.height() - kVerticalPadding - message_size.height();
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      message_->SetBounds(kHorizontalPadding,
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          message_y,
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          message_size.width(),
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          message_size.height());
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Throbber centered within the view.
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  views::Throbber* throbber_;
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Message, multiline, aligned to the bottom of the view.
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  views::Label* message_;
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(CameraImageView);
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTakePhotoView::TakePhotoView(Delegate* delegate)
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : title_label_(NULL),
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      snapshot_button_(NULL),
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      user_image_(NULL),
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      is_capturing_(false),
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      show_title_(true),
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      delegate_(delegate) {
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTakePhotoView::~TakePhotoView() {
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoView::Init() {
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (show_title_) {
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    title_label_ = new views::Label(
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        UTF16ToWide(l10n_util::GetStringUTF16(IDS_USER_IMAGE_SCREEN_TITLE)));
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    title_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    title_label_->SetMultiLine(true);
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CorrectLabelFontSize(title_label_);
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_image_ = new CameraImageView();
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_image_->SetImageSize(
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      gfx::Size(login::kUserImageSize, login::kUserImageSize));
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_image_->Init();
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  snapshot_button_ = new views::ImageButton(this);
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  snapshot_button_->SetFocusable(true);
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  snapshot_button_->SetImage(views::CustomButton::BS_NORMAL,
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             ResourceBundle::GetSharedInstance().GetBitmapNamed(
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 IDR_USER_IMAGE_CAPTURE));
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  snapshot_button_->SetImage(views::CustomButton::BS_DISABLED,
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             ResourceBundle::GetSharedInstance().GetBitmapNamed(
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 IDR_USER_IMAGE_CAPTURE_DISABLED));
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  snapshot_button_->SetAccessibleName(l10n_util::GetStringUTF16(
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      IDS_CHROMEOS_ACC_ACCOUNT_PICTURE));
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  InitLayout();
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Request focus only after the button is added to views hierarchy.
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  snapshot_button_->RequestFocus();
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoView::InitLayout() {
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  views::GridLayout* layout = new views::GridLayout(this);
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->SetInsets(GetInsets());
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetLayoutManager(layout);
191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The title is left-top aligned.
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (show_title_) {
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    views::ColumnSet* column_set = layout->AddColumnSet(kTitleRow);
195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    column_set->AddColumn(views::GridLayout::FILL,
196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          views::GridLayout::LEADING,
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          1,
198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          views::GridLayout::USE_PREF, 0, 0);
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // User image and snapshot button are centered horizontally.
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  views::ColumnSet* column_set = layout->AddColumnSet(kImageRow);
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  column_set->AddColumn(views::GridLayout::CENTER,
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        views::GridLayout::LEADING,
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        1,
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        views::GridLayout::USE_PREF, 0, 0);
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Fill the layout with rows and views now.
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (show_title_) {
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    layout->StartRow(0, kTitleRow);
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    layout->AddView(title_label_);
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->StartRowWithPadding(0, kImageRow, 0, kVerticalPadding);
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(user_image_);
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->StartRowWithPadding(1, kImageRow, 0, kVerticalPadding);
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(snapshot_button_);
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoView::UpdateVideoFrame(const SkBitmap& frame) {
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!is_capturing_)
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!snapshot_button_->IsEnabled()) {
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_image_->SetNormalState();
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    snapshot_button_->SetEnabled(true);
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    snapshot_button_->RequestFocus();
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SkBitmap user_image =
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      skia::ImageOperations::Resize(
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          frame,
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          skia::ImageOperations::RESIZE_BOX,
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          login::kUserImageSize,
233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          login::kUserImageSize);
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_image_->SetImage(&user_image);
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoView::ShowCameraInitializing() {
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  is_capturing_ = true;
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  snapshot_button_->SetImage(views::CustomButton::BS_NORMAL,
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             ResourceBundle::GetSharedInstance().GetBitmapNamed(
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 IDR_USER_IMAGE_CAPTURE));
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  snapshot_button_->SetVisible(true);
244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  snapshot_button_->SetEnabled(false);
245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_image_->SetInitializingState();
246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoView::ShowCameraError() {
249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!is_capturing_)
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  snapshot_button_->SetEnabled(false);
252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_image_->SetErrorState();
253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst SkBitmap& TakePhotoView::GetImage() const {
256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return user_image_->GetImage();
257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoView::SetImage(SkBitmap* image) {
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  is_capturing_ = false;
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  snapshot_button_->SetVisible(false);
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_image_->SetNormalState();
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_image_->SetImage(image);
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsengfx::Size TakePhotoView::GetPreferredSize() {
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return gfx::Size(width(), height());
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoView::ButtonPressed(
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    views::Button* sender, const views::Event& event) {
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(delegate_);
273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(sender == snapshot_button_);
274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  is_capturing_ = !is_capturing_;
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (is_capturing_) {
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    snapshot_button_->SetImage(
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        views::CustomButton::BS_NORMAL,
278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ResourceBundle::GetSharedInstance().GetBitmapNamed(
279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            IDR_USER_IMAGE_CAPTURE));
280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    delegate_->OnCapturingStarted();
281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    snapshot_button_->SetImage(
283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        views::CustomButton::BS_NORMAL,
284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ResourceBundle::GetSharedInstance().GetBitmapNamed(
285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            IDR_USER_IMAGE_RECYCLE));
286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    delegate_->OnCapturingStopped();
287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  snapshot_button_->SchedulePaint();
289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace chromeos
292