Home | History | Annotate | Download | only in chromeos
      1 // Copyright (c) 2011 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 #include "chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.h"
      6 
      7 #include "base/callback.h"
      8 #include "base/path_service.h"
      9 #include "base/values.h"
     10 #include "chrome/browser/chromeos/login/default_user_images.h"
     11 #include "chrome/browser/chromeos/login/user_manager.h"
     12 #include "chrome/browser/chromeos/options/take_photo_dialog.h"
     13 #include "chrome/browser/ui/browser_list.h"
     14 #include "chrome/browser/ui/browser_window.h"
     15 #include "chrome/browser/ui/views/window.h"
     16 #include "chrome/common/chrome_paths.h"
     17 #include "grit/generated_resources.h"
     18 #include "grit/theme_resources.h"
     19 #include "third_party/skia/include/core/SkBitmap.h"
     20 #include "ui/base/l10n/l10n_util.h"
     21 #include "ui/base/resource/resource_bundle.h"
     22 #include "views/window/window.h"
     23 
     24 namespace chromeos {
     25 
     26 namespace {
     27 
     28 // Returns info about extensions for files we support as user images.
     29 SelectFileDialog::FileTypeInfo GetUserImageFileTypeInfo() {
     30   SelectFileDialog::FileTypeInfo file_type_info;
     31   file_type_info.extensions.resize(5);
     32 
     33   file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("bmp"));
     34 
     35   file_type_info.extensions[1].push_back(FILE_PATH_LITERAL("gif"));
     36 
     37   file_type_info.extensions[2].push_back(FILE_PATH_LITERAL("jpg"));
     38   file_type_info.extensions[2].push_back(FILE_PATH_LITERAL("jpeg"));
     39 
     40   file_type_info.extensions[3].push_back(FILE_PATH_LITERAL("png"));
     41 
     42   file_type_info.extensions[4].push_back(FILE_PATH_LITERAL("tif"));
     43   file_type_info.extensions[4].push_back(FILE_PATH_LITERAL("tiff"));
     44 
     45   return file_type_info;
     46 }
     47 
     48 }  // namespace
     49 
     50 ChangePictureOptionsHandler::ChangePictureOptionsHandler() {
     51 }
     52 
     53 ChangePictureOptionsHandler::~ChangePictureOptionsHandler() {
     54   if (select_file_dialog_.get())
     55     select_file_dialog_->ListenerDestroyed();
     56 }
     57 
     58 void ChangePictureOptionsHandler::GetLocalizedValues(
     59     DictionaryValue* localized_strings) {
     60   DCHECK(localized_strings);
     61   localized_strings->SetString("changePicturePage",
     62       l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TITLE));
     63   localized_strings->SetString("changePicturePageDescription",
     64       l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TEXT));
     65   localized_strings->SetString("takePhoto",
     66       l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO));
     67   localized_strings->SetString("chooseFile",
     68       l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_CHOOSE_FILE));
     69 }
     70 
     71 void ChangePictureOptionsHandler::RegisterMessages() {
     72   DCHECK(web_ui_);
     73   web_ui_->RegisterMessageCallback(
     74       "chooseFile",
     75       NewCallback(this, &ChangePictureOptionsHandler::ChooseFile));
     76   web_ui_->RegisterMessageCallback(
     77       "takePhoto",
     78       NewCallback(this, &ChangePictureOptionsHandler::TakePhoto));
     79   web_ui_->RegisterMessageCallback(
     80       "getAvailableImages",
     81       NewCallback(this, &ChangePictureOptionsHandler::GetAvailableImages));
     82   web_ui_->RegisterMessageCallback(
     83       "selectImage",
     84       NewCallback(this, &ChangePictureOptionsHandler::SelectImage));
     85 }
     86 
     87 void ChangePictureOptionsHandler::ChooseFile(const ListValue* args) {
     88   DCHECK(args && args->empty());
     89   if (!select_file_dialog_.get())
     90     select_file_dialog_ = SelectFileDialog::Create(this);
     91 
     92   FilePath downloads_path;
     93   if (!PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS, &downloads_path)) {
     94     NOTREACHED();
     95     return;
     96   }
     97 
     98   // Static so we initialize it only once.
     99   static SelectFileDialog::FileTypeInfo file_type_info =
    100       GetUserImageFileTypeInfo();
    101 
    102   select_file_dialog_->SelectFile(
    103       SelectFileDialog::SELECT_OPEN_FILE,
    104       l10n_util::GetStringUTF16(IDS_DOWNLOAD_TITLE),
    105       downloads_path,
    106       &file_type_info,
    107       0,
    108       FILE_PATH_LITERAL(""),
    109       web_ui_->tab_contents(),
    110       GetBrowserWindow(),
    111       NULL);
    112 }
    113 
    114 void ChangePictureOptionsHandler::TakePhoto(const ListValue* args) {
    115   DCHECK(args && args->empty());
    116   views::Window* window = browser::CreateViewsWindow(
    117       GetBrowserWindow(),
    118       gfx::Rect(),
    119       new TakePhotoDialog());
    120   window->SetIsAlwaysOnTop(true);
    121   window->Show();
    122 }
    123 
    124 void ChangePictureOptionsHandler::GetAvailableImages(const ListValue* args) {
    125   DCHECK(args && args->empty());
    126   ListValue image_urls;
    127   for (int i = 0; i < kDefaultImagesCount; ++i) {
    128     image_urls.Append(new StringValue(GetDefaultImageUrl(i)));
    129   }
    130   web_ui_->CallJavascriptFunction("ChangePictureOptions.addUserImages",
    131                                   image_urls);
    132 }
    133 
    134 void ChangePictureOptionsHandler::SelectImage(const ListValue* args) {
    135   std::string image_url;
    136   if (!args ||
    137       args->GetSize() != 1 ||
    138       !args->GetString(0, &image_url)) {
    139     NOTREACHED();
    140     return;
    141   }
    142   int user_image_index = -1;
    143   if (!IsDefaultImageUrl(image_url, &user_image_index))
    144     return;
    145 
    146   const SkBitmap* image = ResourceBundle::GetSharedInstance().GetBitmapNamed(
    147           kDefaultImageResources[user_image_index]);
    148   UserManager* user_manager = UserManager::Get();
    149   user_manager->SetLoggedInUserImage(*image);
    150   user_manager->SaveUserImagePath(
    151       user_manager->logged_in_user().email(),
    152       GetDefaultImagePath(user_image_index));
    153 }
    154 
    155 void ChangePictureOptionsHandler::FileSelected(const FilePath& path,
    156                                                int index,
    157                                                void* params) {
    158   UserManager::Get()->LoadLoggedInUserImage(path);
    159 }
    160 
    161 gfx::NativeWindow ChangePictureOptionsHandler::GetBrowserWindow() const {
    162   Browser* browser = BrowserList::FindBrowserWithProfile(web_ui_->GetProfile());
    163   if (!browser)
    164     return NULL;
    165   return browser->window()->GetNativeHandle();
    166 }
    167 
    168 }  // namespace chromeos
    169