Home | History | Annotate | Download | only in chromeos
      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_UI_WEBUI_OPTIONS_CHROMEOS_CHANGE_PICTURE_OPTIONS_HANDLER_H_
      6 #define CHROME_BROWSER_UI_WEBUI_OPTIONS_CHROMEOS_CHANGE_PICTURE_OPTIONS_HANDLER_H_
      7 
      8 #include "chrome/browser/chromeos/camera_presence_notifier.h"
      9 #include "chrome/browser/image_decoder.h"
     10 #include "chrome/browser/ui/webui/options/options_ui.h"
     11 #include "content/public/browser/notification_observer.h"
     12 #include "content/public/browser/notification_registrar.h"
     13 #include "ui/gfx/image/image_skia.h"
     14 #include "ui/gfx/native_widget_types.h"
     15 #include "ui/shell_dialogs/select_file_dialog.h"
     16 
     17 namespace base {
     18 class DictionaryValue;
     19 class ListValue;
     20 }
     21 
     22 namespace user_manager {
     23 class User;
     24 }
     25 
     26 namespace chromeos {
     27 
     28 namespace options {
     29 
     30 // ChromeOS user image options page UI handler.
     31 class ChangePictureOptionsHandler : public ::options::OptionsPageUIHandler,
     32                                     public ui::SelectFileDialog::Listener,
     33                                     public content::NotificationObserver,
     34                                     public ImageDecoder::Delegate,
     35                                     public CameraPresenceNotifier::Observer {
     36  public:
     37   ChangePictureOptionsHandler();
     38   virtual ~ChangePictureOptionsHandler();
     39 
     40   // OptionsPageUIHandler implementation.
     41   virtual void GetLocalizedValues(
     42       base::DictionaryValue* localized_strings) OVERRIDE;
     43 
     44   // WebUIMessageHandler implementation.
     45   virtual void RegisterMessages() OVERRIDE;
     46 
     47   // CameraPresenceNotifier::Observer implementation:
     48   virtual void OnCameraPresenceCheckDone(bool is_camera_present) OVERRIDE;
     49 
     50  private:
     51   // Sends list of available default images to the page.
     52   void SendDefaultImages();
     53 
     54   // Sends current selection to the page.
     55   void SendSelectedImage();
     56 
     57   // Sends the profile image to the page. If |should_select| is true then
     58   // the profile image element is selected.
     59   void SendProfileImage(const gfx::ImageSkia& image, bool should_select);
     60 
     61   // Starts profile image update and shows the last downloaded profile image,
     62   // if any, on the page. Shouldn't be called before |SendProfileImage|.
     63   void UpdateProfileImage();
     64 
     65   // Sends previous user image to the page.
     66   void SendOldImage(const std::string& image_url);
     67 
     68   // Starts camera presence check.
     69   void CheckCameraPresence();
     70 
     71   // Updates UI with camera presence state.
     72   void SetCameraPresent(bool present);
     73 
     74   // Opens a file selection dialog to choose user image from file.
     75   void HandleChooseFile(const base::ListValue* args);
     76 
     77   // Handles 'take-photo' button click.
     78   void HandleTakePhoto(const base::ListValue* args);
     79 
     80   // Handles photo taken with WebRTC UI.
     81   void HandlePhotoTaken(const base::ListValue* args);
     82 
     83   // Handles 'discard-photo' button click.
     84   void HandleDiscardPhoto(const base::ListValue* args);
     85 
     86   // Gets the list of available user images and sends it to the page.
     87   void HandleGetAvailableImages(const base::ListValue* args);
     88 
     89   // Handles page initialized event.
     90   void HandlePageInitialized(const base::ListValue* args);
     91 
     92   // Handles page shown event.
     93   void HandlePageShown(const base::ListValue* args);
     94 
     95   // Handles page hidden event.
     96   void HandlePageHidden(const base::ListValue* args);
     97 
     98   // Selects one of the available images as user's.
     99   void HandleSelectImage(const base::ListValue* args);
    100 
    101   // SelectFileDialog::Delegate implementation.
    102   virtual void FileSelected(
    103       const base::FilePath& path,
    104       int index, void* params) OVERRIDE;
    105 
    106   // content::NotificationObserver implementation.
    107   virtual void Observe(int type,
    108                        const content::NotificationSource& source,
    109                        const content::NotificationDetails& details) OVERRIDE;
    110 
    111   // Sets user image to photo taken from camera.
    112   void SetImageFromCamera(const gfx::ImageSkia& photo);
    113 
    114   // Returns handle to browser window or NULL if it can't be found.
    115   gfx::NativeWindow GetBrowserWindow() const;
    116 
    117   // Overriden from ImageDecoder::Delegate:
    118   virtual void OnImageDecoded(const ImageDecoder* decoder,
    119                               const SkBitmap& decoded_image) OVERRIDE;
    120   virtual void OnDecodeImageFailed(const ImageDecoder* decoder) OVERRIDE;
    121 
    122   // Returns user related to current WebUI. If this user doesn't exist,
    123   // returns active user.
    124   user_manager::User* GetUser() const;
    125 
    126   scoped_refptr<ui::SelectFileDialog> select_file_dialog_;
    127 
    128   // Previous user image from camera/file and its data URL.
    129   gfx::ImageSkia previous_image_;
    130   std::string previous_image_url_;
    131 
    132   // Index of the previous user image.
    133   int previous_image_index_;
    134 
    135   // Last user photo, if taken.
    136   gfx::ImageSkia user_photo_;
    137 
    138   // Data URL for |user_photo_|.
    139   std::string user_photo_data_url_;
    140 
    141   content::NotificationRegistrar registrar_;
    142 
    143   // Last ImageDecoder instance used to decode an image blob received by
    144   // HandlePhotoTaken.
    145   scoped_refptr<ImageDecoder> image_decoder_;
    146 
    147   DISALLOW_COPY_AND_ASSIGN(ChangePictureOptionsHandler);
    148 };
    149 
    150 }  // namespace options
    151 }  // namespace chromeos
    152 
    153 #endif  // CHROME_BROWSER_UI_WEBUI_OPTIONS_CHROMEOS_CHANGE_PICTURE_OPTIONS_HANDLER_H_
    154