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