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/options/take_photo_dialog.h" 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/string_util.h" 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/utf_string_conversions.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/helper.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/user_manager.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/chromium_strings.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/generated_resources.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/locale_settings.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/accessibility/accessible_view_state.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/l10n/l10n_util.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/layout/layout_constants.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace chromeos { 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace { 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The resolution of the picture we want to get from the camera. 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst int kFrameWidth = 480; 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst int kFrameHeight = 480; 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTakePhotoDialog::TakePhotoDialog() 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : take_photo_view_(NULL), 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen camera_controller_(this) { 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen camera_controller_.set_frame_width(kFrameWidth); 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen camera_controller_.set_frame_height(kFrameHeight); 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen registrar_.Add( 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this, 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationType::SCREEN_LOCK_STATE_CHANGED, 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::AllSources()); 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool TakePhotoDialog::IsDialogButtonEnabled( 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageBoxFlags::DialogButton button) const { 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (button == MessageBoxFlags::DIALOGBUTTON_CANCEL) 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen else if (button == MessageBoxFlags::DIALOGBUTTON_OK) 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return !take_photo_view_->is_capturing(); 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool TakePhotoDialog::Cancel() { 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen camera_controller_.Stop(); 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool TakePhotoDialog::Accept() { 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen camera_controller_.Stop(); 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserManager* user_manager = UserManager::Get(); 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(user_manager); 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const UserManager::User& user = user_manager->logged_in_user(); 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(!user.email().empty()); 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const SkBitmap& image = take_photo_view_->GetImage(); 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen user_manager->SetLoggedInUserImage(image); 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen user_manager->SaveUserImage(user.email(), image); 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenviews::View* TakePhotoDialog::GetContentsView() { 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Lazy initialization upon request. 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!take_photo_view_) { 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen take_photo_view_ = new TakePhotoView(this); 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen take_photo_view_->Init(); 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddChildView(take_photo_view_); 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen InitCamera(); 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return this; 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoDialog::GetAccessibleState(ui::AccessibleViewState* state) { 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen state->name = l10n_util::GetStringUTF16( 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO); 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen state->role = ui::AccessibilityTypes::ROLE_DIALOG; 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoDialog::OnCapturingStarted() { 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GetDialogClientView()->ok_button()->SetEnabled(false); 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoDialog::OnCapturingStopped() { 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GetDialogClientView()->ok_button()->SetEnabled(true); 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GetDialogClientView()->ok_button()->RequestFocus(); 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoDialog::OnCaptureSuccess() { 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SkBitmap frame; 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen camera_controller_.GetFrame(&frame); 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!frame.isNull()) 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen take_photo_view_->UpdateVideoFrame(frame); 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoDialog::OnCaptureFailure() { 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen take_photo_view_->ShowCameraError(); 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoDialog::Observe(NotificationType type, 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const NotificationSource& source, 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const NotificationDetails& details) { 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (type != NotificationType::SCREEN_LOCK_STATE_CHANGED) 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_screen_locked = *Details<bool>(details).ptr(); 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (is_screen_locked) 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen camera_controller_.Stop(); 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen else 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen InitCamera(); 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoDialog::Layout() { 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int left = views::kPanelHorizMargin; 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int top = views::kPanelVertMargin; 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int contents_width = width() - 2 * left; 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int contents_height = height() - 2 * top; 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen take_photo_view_->SetBounds(left, top, contents_width, contents_height); 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsengfx::Size TakePhotoDialog::GetPreferredSize() { 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::Size(login::kUserImageSize * 2, (login::kUserImageSize * 3 / 2)); 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TakePhotoDialog::InitCamera() { 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen take_photo_view_->ShowCameraInitializing(); 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen camera_controller_.Start(); 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace chromeos 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 140