user_image_screen.h revision effb81e5f8246d0db0270817048dc992db66e9fb
1// Copyright (c) 2012 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#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_USER_IMAGE_SCREEN_H_
6#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_USER_IMAGE_SCREEN_H_
7
8#include "base/compiler_specific.h"
9#include "base/memory/scoped_ptr.h"
10#include "chrome/browser/chromeos/login/screens/user_image_screen_actor.h"
11#include "chrome/browser/chromeos/login/screens/wizard_screen.h"
12#include "chrome/browser/chromeos/login/user.h"
13#include "chrome/browser/chromeos/login/user_image_sync_observer.h"
14#include "chrome/browser/image_decoder.h"
15#include "content/public/browser/notification_observer.h"
16#include "content/public/browser/notification_registrar.h"
17
18namespace base {
19class Timer;
20class Value;
21};
22
23namespace policy {
24class PolicyChangeRegistrar;
25}
26
27namespace chromeos {
28
29class UserImageScreen: public WizardScreen,
30                       public UserImageScreenActor::Delegate,
31                       public ImageDecoder::Delegate,
32                       public content::NotificationObserver,
33                       public UserImageSyncObserver::Observer {
34 public:
35  UserImageScreen(ScreenObserver* screen_observer,
36                  UserImageScreenActor* actor);
37  virtual ~UserImageScreen();
38
39  // Indicates whether profile picture is enabled for given user.
40  void SetProfilePictureEnabled(bool support_profile_picture);
41  // Sets |user_id| of user that would have picture updated.
42  void SetUserID(const std::string& user_id);
43
44  // WizardScreen implementation:
45  virtual void PrepareToShow() OVERRIDE;
46  virtual void Show() OVERRIDE;
47  virtual void Hide() OVERRIDE;
48  virtual std::string GetName() const OVERRIDE;
49
50  // UserImageScreenActor::Delegate implementation:
51  virtual void OnScreenReady() OVERRIDE;
52  virtual void OnPhotoTaken(const std::string& raw_data) OVERRIDE;
53  virtual void OnImageSelected(const std::string& image_url,
54                               const std::string& image_type,
55                               bool is_user_selection) OVERRIDE;
56  virtual void OnImageAccepted() OVERRIDE;
57  virtual void OnActorDestroyed(UserImageScreenActor* actor) OVERRIDE;
58
59  virtual bool profile_picture_absent() OVERRIDE;
60  virtual int selected_image() OVERRIDE;
61  virtual std::string profile_picture_data_url() OVERRIDE;
62
63  // content::NotificationObserver implementation:
64  virtual void Observe(int type,
65                       const content::NotificationSource& source,
66                       const content::NotificationDetails& details) OVERRIDE;
67
68  // ImageDecoder::Delegate implementation:
69  virtual void OnImageDecoded(const ImageDecoder* decoder,
70                              const SkBitmap& decoded_image) OVERRIDE;
71  virtual void OnDecodeImageFailed(const ImageDecoder* decoder) OVERRIDE;
72  virtual void OnCameraPresenceCheckDone(bool is_camera_present) OVERRIDE;
73
74  // UserImageSyncObserver::Observer implementation:
75  virtual void OnInitialSync(bool local_image_updated) OVERRIDE;
76
77  bool user_selected_image() const { return user_has_selected_image_; }
78
79 private:
80  // Called when whaiting for sync timed out.
81  void OnSyncTimeout();
82
83  bool IsWaitingForSync() const;
84
85  // Called when the policy::key::kUserAvatarImage policy changes while the
86  // screen is being shown. If the policy is set, closes the screen because the
87  // user is not allowed to override a policy-set image.
88  void OnUserImagePolicyChanged(const base::Value* previous,
89                                const base::Value* current);
90
91  // Returns current user.
92  const User* GetUser();
93
94  // Returns UserImageManager for the current user.
95  UserImageManager* GetUserImageManager();
96
97  // Returns UserImageSyncObserver for the current user.
98  UserImageSyncObserver* GetSyncObserver();
99
100  // Called when it's decided not to skip the screen.
101  void HideCurtain();
102
103  // Closes the screen.
104  void ExitScreen();
105
106  content::NotificationRegistrar notification_registrar_;
107
108  scoped_ptr<policy::PolicyChangeRegistrar> policy_registrar_;
109
110  UserImageScreenActor* actor_;
111
112  // Last ImageDecoder instance used to decode an image blob received by
113  // HandlePhotoTaken.
114  scoped_refptr<ImageDecoder> image_decoder_;
115
116  // Last user photo, if taken.
117  gfx::ImageSkia user_photo_;
118
119  // If |true|, decoded photo should be immediately accepeted (i.e., both
120  // HandleTakePhoto and HandleImageAccepted have already been called but we're
121  // still waiting for  photo image decoding to finish.
122  bool accept_photo_after_decoding_;
123
124  // Index of the selected user image.
125  int selected_image_;
126
127  bool profile_picture_enabled_;
128
129  // Encoded profile picture.
130  std::string profile_picture_data_url_;
131
132  // True if user has no custom profile picture.
133  bool profile_picture_absent_;
134
135  std::string user_id_;
136
137  // Timer used for waiting for user image sync.
138  scoped_ptr<base::Timer> sync_timer_;
139
140  // If screen ready to be shown.
141  bool is_screen_ready_;
142
143  // True if user has explicitly selected some image.
144  bool user_has_selected_image_;
145
146  DISALLOW_COPY_AND_ASSIGN(UserImageScreen);
147};
148
149}  // namespace chromeos
150
151#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_USER_IMAGE_SCREEN_H_
152