Home | History | Annotate | Download | only in screens
      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