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 19 namespace base { 20 class Timer; 21 class Value; 22 }; 23 24 namespace policy { 25 class PolicyChangeRegistrar; 26 } 27 28 namespace chromeos { 29 30 class 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 const User* GetUser(); 93 94 // Called when the camera presence check has been completed. 95 void OnCameraPresenceCheckDone(); 96 97 // Called when it's decided not to skip the screen. 98 void HideCurtain(); 99 100 // Closes the screen. 101 void ExitScreen(); 102 103 content::NotificationRegistrar notification_registrar_; 104 105 scoped_ptr<policy::PolicyChangeRegistrar> policy_registrar_; 106 107 UserImageScreenActor* actor_; 108 109 base::WeakPtrFactory<UserImageScreen> weak_factory_; 110 111 // Last ImageDecoder instance used to decode an image blob received by 112 // HandlePhotoTaken. 113 scoped_refptr<ImageDecoder> image_decoder_; 114 115 // Last user photo, if taken. 116 gfx::ImageSkia user_photo_; 117 118 // If |true|, decoded photo should be immediately accepeted (i.e., both 119 // HandleTakePhoto and HandleImageAccepted have already been called but we're 120 // still waiting for photo image decoding to finish. 121 bool accept_photo_after_decoding_; 122 123 // Index of the selected user image. 124 int selected_image_; 125 126 bool profile_picture_enabled_; 127 128 // Encoded profile picture. 129 std::string profile_picture_data_url_; 130 131 // True if user has no custom profile picture. 132 bool profile_picture_absent_; 133 134 std::string user_id_; 135 136 // Timer used for waiting for user image sync. 137 scoped_ptr<base::Timer> sync_timer_; 138 139 // If screen ready to be shown. 140 bool is_screen_ready_; 141 142 // True if user has explicitly selected some image. 143 bool user_has_selected_image_; 144 145 // True if camera was available last time. 146 bool was_camera_present_; 147 148 DISALLOW_COPY_AND_ASSIGN(UserImageScreen); 149 }; 150 151 } // namespace chromeos 152 153 #endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_USER_IMAGE_SCREEN_H_ 154