user_image_screen.h revision 3551c9c881056c480085172ff9840cab31610854
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/weak_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;
20};
21
22namespace chromeos {
23
24class UserImageScreen: public WizardScreen,
25                       public UserImageScreenActor::Delegate,
26                       public ImageDecoder::Delegate,
27                       public content::NotificationObserver,
28                       public UserImageSyncObserver::Observer {
29 public:
30  UserImageScreen(ScreenObserver* screen_observer,
31                  UserImageScreenActor* actor);
32  virtual ~UserImageScreen();
33
34  // Indicates whether profile picture is enabled for given user.
35  void SetProfilePictureEnabled(bool support_profile_picture);
36  // Sets |user_id| of user that would have picture updated.
37  void SetUserID(const std::string& user_id);
38
39  // WizardScreen implementation:
40  virtual void PrepareToShow() OVERRIDE;
41  virtual void Show() OVERRIDE;
42  virtual void Hide() OVERRIDE;
43  virtual std::string GetName() const OVERRIDE;
44
45  // UserImageScreenActor::Delegate implementation:
46  virtual void OnScreenReady() OVERRIDE;
47  virtual void OnPhotoTaken(const std::string& raw_data) OVERRIDE;
48  virtual void CheckCameraPresence() OVERRIDE;
49  virtual void OnImageSelected(const std::string& image_url,
50                               const std::string& image_type,
51                               bool is_user_selection) OVERRIDE;
52  virtual void OnImageAccepted() OVERRIDE;
53  virtual void OnActorDestroyed(UserImageScreenActor* actor) OVERRIDE;
54
55  virtual bool profile_picture_absent() OVERRIDE;
56  virtual int selected_image() OVERRIDE;
57  virtual std::string profile_picture_data_url() OVERRIDE;
58
59  // content::NotificationObserver implementation:
60  virtual void Observe(int type,
61                       const content::NotificationSource& source,
62                       const content::NotificationDetails& details) OVERRIDE;
63
64  // ImageDecoder::Delegate implementation:
65  virtual void OnImageDecoded(const ImageDecoder* decoder,
66                              const SkBitmap& decoded_image) OVERRIDE;
67  virtual void OnDecodeImageFailed(const ImageDecoder* decoder) OVERRIDE;
68
69  // UserImageSyncObserver::Observer implementation:
70  virtual void OnInitialSync(bool local_image_updated) OVERRIDE;
71
72  bool user_selected_image() const { return user_has_selected_image_; }
73
74 private:
75  // Called when whaiting for sync timed out.
76  void OnSyncTimeout();
77
78  bool IsWaitingForSync() const;
79
80  const User* GetUser();
81
82  // Called when the camera presence check has been completed.
83  void OnCameraPresenceCheckDone();
84
85  content::NotificationRegistrar registrar_;
86
87  UserImageScreenActor* actor_;
88
89  base::WeakPtrFactory<UserImageScreen> weak_factory_;
90
91  // Last ImageDecoder instance used to decode an image blob received by
92  // HandlePhotoTaken.
93  scoped_refptr<ImageDecoder> image_decoder_;
94
95  // Last user photo, if taken.
96  gfx::ImageSkia user_photo_;
97
98  // If |true|, decoded photo should be immediately accepeted (i.e., both
99  // HandleTakePhoto and HandleImageAccepted have already been called but we're
100  // still waiting for  photo image decoding to finish.
101  bool accept_photo_after_decoding_;
102
103  // Index of the selected user image.
104  int selected_image_;
105
106  bool profile_picture_enabled_;
107
108  // Encoded profile picture.
109  std::string profile_picture_data_url_;
110
111  // True if user has no custom profile picture.
112  bool profile_picture_absent_;
113
114  std::string user_id_;
115
116  // Timer used for waiting for user image sync.
117  scoped_ptr<base::Timer> sync_timer_;
118
119  // If screen ready to be shown.
120  bool is_screen_ready_;
121
122  // True if user has explicitly selected some image.
123  bool user_has_selected_image_;
124
125  DISALLOW_COPY_AND_ASSIGN(UserImageScreen);
126};
127
128}  // namespace chromeos
129
130#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_USER_IMAGE_SCREEN_H_
131