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