// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/chromeos/options/take_photo_dialog.h" #include "base/string_util.h" #include "base/utf_string_conversions.h" #include "chrome/browser/chromeos/login/helper.h" #include "chrome/browser/chromeos/login/user_manager.h" #include "content/common/notification_service.h" #include "content/common/notification_type.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" #include "grit/locale_settings.h" #include "ui/base/accessibility/accessible_view_state.h" #include "ui/base/l10n/l10n_util.h" #include "views/layout/layout_constants.h" namespace chromeos { namespace { // The resolution of the picture we want to get from the camera. const int kFrameWidth = 480; const int kFrameHeight = 480; } // namespace TakePhotoDialog::TakePhotoDialog() : take_photo_view_(NULL), camera_controller_(this) { camera_controller_.set_frame_width(kFrameWidth); camera_controller_.set_frame_height(kFrameHeight); registrar_.Add( this, NotificationType::SCREEN_LOCK_STATE_CHANGED, NotificationService::AllSources()); } bool TakePhotoDialog::IsDialogButtonEnabled( MessageBoxFlags::DialogButton button) const { if (button == MessageBoxFlags::DIALOGBUTTON_CANCEL) return true; else if (button == MessageBoxFlags::DIALOGBUTTON_OK) return !take_photo_view_->is_capturing(); NOTREACHED(); return false; } bool TakePhotoDialog::Cancel() { camera_controller_.Stop(); return true; } bool TakePhotoDialog::Accept() { camera_controller_.Stop(); UserManager* user_manager = UserManager::Get(); DCHECK(user_manager); const UserManager::User& user = user_manager->logged_in_user(); DCHECK(!user.email().empty()); const SkBitmap& image = take_photo_view_->GetImage(); user_manager->SetLoggedInUserImage(image); user_manager->SaveUserImage(user.email(), image); return true; } views::View* TakePhotoDialog::GetContentsView() { // Lazy initialization upon request. if (!take_photo_view_) { take_photo_view_ = new TakePhotoView(this); take_photo_view_->Init(); AddChildView(take_photo_view_); InitCamera(); } return this; } void TakePhotoDialog::GetAccessibleState(ui::AccessibleViewState* state) { state->name = l10n_util::GetStringUTF16( IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO); state->role = ui::AccessibilityTypes::ROLE_DIALOG; } void TakePhotoDialog::OnCapturingStarted() { GetDialogClientView()->ok_button()->SetEnabled(false); } void TakePhotoDialog::OnCapturingStopped() { GetDialogClientView()->ok_button()->SetEnabled(true); GetDialogClientView()->ok_button()->RequestFocus(); } void TakePhotoDialog::OnCaptureSuccess() { SkBitmap frame; camera_controller_.GetFrame(&frame); if (!frame.isNull()) take_photo_view_->UpdateVideoFrame(frame); } void TakePhotoDialog::OnCaptureFailure() { take_photo_view_->ShowCameraError(); } void TakePhotoDialog::Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) { if (type != NotificationType::SCREEN_LOCK_STATE_CHANGED) return; bool is_screen_locked = *Details<bool>(details).ptr(); if (is_screen_locked) camera_controller_.Stop(); else InitCamera(); } void TakePhotoDialog::Layout() { int left = views::kPanelHorizMargin; int top = views::kPanelVertMargin; int contents_width = width() - 2 * left; int contents_height = height() - 2 * top; take_photo_view_->SetBounds(left, top, contents_width, contents_height); } gfx::Size TakePhotoDialog::GetPreferredSize() { return gfx::Size(login::kUserImageSize * 2, (login::kUserImageSize * 3 / 2)); } void TakePhotoDialog::InitCamera() { take_photo_view_->ShowCameraInitializing(); camera_controller_.Start(); } } // namespace chromeos