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