// 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/login/user_image_screen.h" #include "base/compiler_specific.h" #include "chrome/browser/chromeos/login/default_user_images.h" #include "chrome/browser/chromeos/login/login_utils.h" #include "chrome/browser/chromeos/login/screen_observer.h" #include "chrome/browser/chromeos/login/user_image_view.h" #include "chrome/browser/chromeos/login/user_manager.h" #include "content/common/notification_service.h" #include "content/common/notification_type.h" #include "grit/theme_resources.h" #include "ui/base/resource/resource_bundle.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 UserImageScreen::UserImageScreen(WizardScreenDelegate* delegate) : ViewScreen<UserImageView>(delegate), 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()); } UserImageScreen::~UserImageScreen() { } void UserImageScreen::Refresh() { DCHECK(view()); UserManager* user_manager = UserManager::Get(); std::string logged_in_user = user_manager->logged_in_user().email(); view()->OnImageSelected( user_manager->GetUserDefaultImageIndex(logged_in_user)); } void UserImageScreen::Hide() { camera_controller_.Stop(); ViewScreen<UserImageView>::Hide(); } UserImageView* UserImageScreen::AllocateView() { return new UserImageView(this); } void UserImageScreen::StartCamera() { DCHECK(view()); view()->ShowCameraInitializing(); camera_controller_.Start(); } void UserImageScreen::StopCamera() { camera_controller_.Stop(); } void UserImageScreen::OnCaptureSuccess() { DCHECK(view()); SkBitmap frame; camera_controller_.GetFrame(&frame); if (!frame.isNull()) view()->UpdateVideoFrame(frame); } void UserImageScreen::OnCaptureFailure() { DCHECK(view()); view()->ShowCameraError(); } void UserImageScreen::OnPhotoTaken(const SkBitmap& image) { camera_controller_.Stop(); UserManager* user_manager = UserManager::Get(); DCHECK(user_manager); const UserManager::User& user = user_manager->logged_in_user(); DCHECK(!user.email().empty()); user_manager->SetLoggedInUserImage(image); user_manager->SaveUserImage(user.email(), image); if (delegate()) delegate()->GetObserver(this)->OnExit(ScreenObserver::USER_IMAGE_SELECTED); } void UserImageScreen::OnDefaultImageSelected(int index) { 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 = ResourceBundle::GetSharedInstance().GetBitmapNamed( kDefaultImageResources[index]); user_manager->SetLoggedInUserImage(*image); user_manager->SaveUserImagePath( user.email(), GetDefaultImagePath(static_cast<size_t>(index))); if (delegate()) delegate()->GetObserver(this)->OnExit(ScreenObserver::USER_IMAGE_SELECTED); } void UserImageScreen::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) StopCamera(); else if (view()->IsCapturing()) StartCamera(); } } // namespace chromeos