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