user_image_screen.cc revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/chromeos/login/user_image_screen.h" 6 7#include "base/compiler_specific.h" 8#include "base/time.h" 9#include "chrome/browser/chromeos/login/login_utils.h" 10#include "chrome/browser/chromeos/login/screen_observer.h" 11#include "chrome/browser/chromeos/login/user_image_downloader.h" 12#include "chrome/browser/chromeos/login/user_image_view.h" 13#include "chrome/browser/chromeos/login/user_manager.h" 14#include "chrome/common/notification_service.h" 15#include "chrome/common/notification_type.h" 16 17namespace chromeos { 18 19namespace { 20 21// The resolution of the picture we want to get from the camera. 22const int kFrameWidth = 480; 23const int kFrameHeight = 480; 24 25// Frame rate in milliseconds for video capturing. 26// We want 25 FPS. 27const int kFrameRate = 40; 28 29} // namespace 30 31UserImageScreen::UserImageScreen(WizardScreenDelegate* delegate) 32 : ViewScreen<UserImageView>(delegate), 33 ALLOW_THIS_IN_INITIALIZER_LIST(camera_(new Camera(this))) { 34 registrar_.Add( 35 this, 36 NotificationType::SCREEN_LOCK_STATE_CHANGED, 37 NotificationService::AllSources()); 38 if (!camera_->Initialize(kFrameWidth, kFrameHeight)) { 39 camera_.reset(); 40 } else { 41 // We want to mimic mirror behavior so we want the image reflected from Y 42 // axis. 43 camera_->set_mirrored(true); 44 } 45} 46 47UserImageScreen::~UserImageScreen() { 48} 49 50void UserImageScreen::Refresh() { 51 if (camera_.get()) 52 camera_->StartCapturing(base::TimeDelta::FromMilliseconds(kFrameRate)); 53} 54 55void UserImageScreen::Hide() { 56 if (camera_.get()) 57 camera_->StopCapturing(); 58 ViewScreen<UserImageView>::Hide(); 59} 60 61UserImageView* UserImageScreen::AllocateView() { 62 return new UserImageView(this); 63} 64 65void UserImageScreen::OnVideoFrameCaptured(const SkBitmap& frame) { 66 if (view()) 67 view()->UpdateVideoFrame(frame); 68} 69 70void UserImageScreen::OnOK(const SkBitmap& image) { 71 UserManager* user_manager = UserManager::Get(); 72 if (user_manager) { 73 // TODO(avayvod): Check that there's logged in user actually. 74 const UserManager::User& user = user_manager->logged_in_user(); 75 user_manager->SaveUserImage(user.email(), image); 76 } 77 if (delegate()) 78 delegate()->GetObserver(this)->OnExit(ScreenObserver::USER_IMAGE_SELECTED); 79} 80 81void UserImageScreen::OnCancel() { 82 // Download user image from his Google account. 83 UserManager* user_manager = UserManager::Get(); 84 if (user_manager) { 85 // TODO(avayvod): Check that there's logged in user actually. 86 const UserManager::User& user = user_manager->logged_in_user(); 87 new UserImageDownloader(user.email(), 88 LoginUtils::Get()->GetAuthToken()); 89 } 90 if (delegate()) 91 delegate()->GetObserver(this)->OnExit(ScreenObserver::USER_IMAGE_SKIPPED); 92} 93 94void UserImageScreen::Observe(NotificationType type, 95 const NotificationSource& source, 96 const NotificationDetails& details) { 97 if (type != NotificationType::SCREEN_LOCK_STATE_CHANGED || 98 !camera_.get()) 99 return; 100 101 bool is_screen_locked = *Details<bool>(details).ptr(); 102 if (is_screen_locked) 103 camera_->StopCapturing(); 104 else 105 camera_->StartCapturing(base::TimeDelta::FromMilliseconds(kFrameRate)); 106} 107 108} // namespace chromeos 109 110