| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/webui/options/chromeos/change_picture_options_handle
r.h" | 5 #include "chrome/browser/ui/webui/options/chromeos/change_picture_options_handle
r.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 file_type_info.extensions[4].push_back(FILE_PATH_LITERAL("tif")); | 52 file_type_info.extensions[4].push_back(FILE_PATH_LITERAL("tif")); |
| 53 file_type_info.extensions[4].push_back(FILE_PATH_LITERAL("tiff")); | 53 file_type_info.extensions[4].push_back(FILE_PATH_LITERAL("tiff")); |
| 54 | 54 |
| 55 return file_type_info; | 55 return file_type_info; |
| 56 } | 56 } |
| 57 | 57 |
| 58 } // namespace | 58 } // namespace |
| 59 | 59 |
| 60 ChangePictureOptionsHandler::ChangePictureOptionsHandler() | 60 ChangePictureOptionsHandler::ChangePictureOptionsHandler() |
| 61 : previous_image_data_url_(chrome::kAboutBlankURL), | 61 : previous_image_data_url_(chrome::kAboutBlankURL), |
| 62 previous_image_index_(User::kInvalidImageIndex), |
| 62 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { | 63 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { |
| 63 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED, | 64 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED, |
| 64 content::NotificationService::AllSources()); | 65 content::NotificationService::AllSources()); |
| 65 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATE_FAILED, | 66 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATE_FAILED, |
| 66 content::NotificationService::AllSources()); | 67 content::NotificationService::AllSources()); |
| 67 } | 68 } |
| 68 | 69 |
| 69 ChangePictureOptionsHandler::~ChangePictureOptionsHandler() { | 70 ChangePictureOptionsHandler::~ChangePictureOptionsHandler() { |
| 70 if (select_file_dialog_.get()) | 71 if (select_file_dialog_.get()) |
| 71 select_file_dialog_->ListenerDestroyed(); | 72 select_file_dialog_->ListenerDestroyed(); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 } | 106 } |
| 106 | 107 |
| 107 void ChangePictureOptionsHandler::RegisterMessages() { | 108 void ChangePictureOptionsHandler::RegisterMessages() { |
| 108 DCHECK(web_ui_); | 109 DCHECK(web_ui_); |
| 109 web_ui_->RegisterMessageCallback("chooseFile", | 110 web_ui_->RegisterMessageCallback("chooseFile", |
| 110 base::Bind(&ChangePictureOptionsHandler::HandleChooseFile, | 111 base::Bind(&ChangePictureOptionsHandler::HandleChooseFile, |
| 111 base::Unretained(this))); | 112 base::Unretained(this))); |
| 112 web_ui_->RegisterMessageCallback("takePhoto", | 113 web_ui_->RegisterMessageCallback("takePhoto", |
| 113 base::Bind(&ChangePictureOptionsHandler::HandleTakePhoto, | 114 base::Bind(&ChangePictureOptionsHandler::HandleTakePhoto, |
| 114 base::Unretained(this))); | 115 base::Unretained(this))); |
| 115 web_ui_->RegisterMessageCallback("getSelectedImage", | 116 web_ui_->RegisterMessageCallback("onPageShown", |
| 116 base::Bind(&ChangePictureOptionsHandler::HandleGetSelectedImage, | 117 base::Bind(&ChangePictureOptionsHandler::HandleOnPageShown, |
| 117 base::Unretained(this))); | 118 base::Unretained(this))); |
| 118 web_ui_->RegisterMessageCallback("selectImage", | 119 web_ui_->RegisterMessageCallback("selectImage", |
| 119 base::Bind(&ChangePictureOptionsHandler::HandleSelectImage, | 120 base::Bind(&ChangePictureOptionsHandler::HandleSelectImage, |
| 120 base::Unretained(this))); | 121 base::Unretained(this))); |
| 121 } | 122 } |
| 122 | 123 |
| 123 void ChangePictureOptionsHandler::SendAvailableImages() { | 124 void ChangePictureOptionsHandler::SendAvailableImages() { |
| 124 ListValue image_urls; | 125 ListValue image_urls; |
| 125 for (int i = 0; i < kDefaultImagesCount; ++i) { | 126 for (int i = 0; i < kDefaultImagesCount; ++i) { |
| 126 image_urls.Append(new StringValue(GetDefaultImageUrl(i))); | 127 image_urls.Append(new StringValue(GetDefaultImageUrl(i))); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 | 159 |
| 159 void ChangePictureOptionsHandler::HandleTakePhoto(const ListValue* args) { | 160 void ChangePictureOptionsHandler::HandleTakePhoto(const ListValue* args) { |
| 160 DCHECK(args && args->empty()); | 161 DCHECK(args && args->empty()); |
| 161 views::Widget* window = browser::CreateViewsWindow( | 162 views::Widget* window = browser::CreateViewsWindow( |
| 162 GetBrowserWindow(), | 163 GetBrowserWindow(), |
| 163 new TakePhotoDialog(this)); | 164 new TakePhotoDialog(this)); |
| 164 window->SetAlwaysOnTop(true); | 165 window->SetAlwaysOnTop(true); |
| 165 window->Show(); | 166 window->Show(); |
| 166 } | 167 } |
| 167 | 168 |
| 168 void ChangePictureOptionsHandler::HandleGetSelectedImage( | 169 void ChangePictureOptionsHandler::HandleOnPageShown( |
| 169 const base::ListValue* args) { | 170 const base::ListValue* args) { |
| 170 // TODO(ivankr): rename this function as it has become much bigger | |
| 171 // than just querying the currently selected image. | |
| 172 DCHECK(args && args->empty()); | 171 DCHECK(args && args->empty()); |
| 173 CheckCameraPresence(); | 172 CheckCameraPresence(); |
| 174 SendSelectedImage(); | 173 SendSelectedImage(); |
| 175 // Fetch user's profile picture again to see if it has changed. | 174 UpdateProfileImage(); |
| 176 UserManager::Get()->DownloadProfileImage(); | |
| 177 } | 175 } |
| 178 | 176 |
| 179 void ChangePictureOptionsHandler::SendSelectedImage() { | 177 void ChangePictureOptionsHandler::SendSelectedImage() { |
| 180 const User& user = UserManager::Get()->logged_in_user(); | 178 const User& user = UserManager::Get()->logged_in_user(); |
| 181 DCHECK(!user.email().empty()); | 179 DCHECK(!user.email().empty()); |
| 182 | 180 |
| 183 previous_image_index_ = user.image_index(); | 181 previous_image_index_ = user.image_index(); |
| 184 if (previous_image_index_ == User::kInvalidImageIndex) { | |
| 185 // TODO(ivankr): this may happen if user image hasn't completed loading | |
| 186 // from file yet. | |
| 187 previous_image_index_ = 0; | |
| 188 } | |
| 189 | |
| 190 switch (previous_image_index_) { | 182 switch (previous_image_index_) { |
| 191 case User::kExternalImageIndex: { | 183 case User::kExternalImageIndex: { |
| 192 // User has image from camera/file, record it and add to the image list. | 184 // User has image from camera/file, record it and add to the image list. |
| 193 previous_image_ = user.image(); | 185 previous_image_ = user.image(); |
| 194 previous_image_data_url_ = web_ui_util::GetImageDataUrl(previous_image_); | 186 previous_image_data_url_ = web_ui_util::GetImageDataUrl(previous_image_); |
| 195 web_ui_->CallJavascriptFunction("ChangePictureOptions.setOldImage"); | 187 web_ui_->CallJavascriptFunction("ChangePictureOptions.setOldImage"); |
| 196 break; | 188 break; |
| 197 } | 189 } |
| 198 case User::kProfileImageIndex: { | 190 case User::kProfileImageIndex: { |
| 199 // User has his/her Profile image as the current image. | 191 // User has his/her Profile image as the current image. |
| 200 base::StringValue image_data_url( | 192 SendProfileImage(user.image(), true); |
| 201 web_ui_util::GetImageDataUrl(user.image())); | |
| 202 base::FundamentalValue select(true); | |
| 203 web_ui_->CallJavascriptFunction("ChangePictureOptions.setProfileImage", | |
| 204 image_data_url, select); | |
| 205 break; | 193 break; |
| 206 } | 194 } |
| 207 default: { | 195 default: { |
| 208 DCHECK(previous_image_index_ >= 0 && | 196 DCHECK(previous_image_index_ >= 0 && |
| 209 previous_image_index_ < kDefaultImagesCount); | 197 previous_image_index_ < kDefaultImagesCount); |
| 210 // User has image from the set of default images. | 198 // User has image from the set of default images. |
| 211 base::StringValue image_url(GetDefaultImageUrl(previous_image_index_)); | 199 base::StringValue image_url(GetDefaultImageUrl(previous_image_index_)); |
| 212 web_ui_->CallJavascriptFunction("ChangePictureOptions.setSelectedImage", | 200 web_ui_->CallJavascriptFunction("ChangePictureOptions.setSelectedImage", |
| 213 image_url); | 201 image_url); |
| 214 } | 202 } |
| 215 } | 203 } |
| 216 } | 204 } |
| 217 | 205 |
| 206 void ChangePictureOptionsHandler::SendProfileImage(const SkBitmap& image, |
| 207 bool should_select) { |
| 208 base::StringValue data_url(web_ui_util::GetImageDataUrl(image)); |
| 209 base::FundamentalValue select(should_select); |
| 210 web_ui_->CallJavascriptFunction("ChangePictureOptions.setProfileImage", |
| 211 data_url, select); |
| 212 } |
| 213 |
| 214 void ChangePictureOptionsHandler::UpdateProfileImage() { |
| 215 UserManager* user_manager = UserManager::Get(); |
| 216 |
| 217 // If we have a downloaded profile image and haven't sent it in |
| 218 // |SendSelectedImage|, send it now (without selecting). |
| 219 if (previous_image_index_ != User::kProfileImageIndex && |
| 220 !user_manager->downloaded_profile_image().empty()) |
| 221 SendProfileImage(user_manager->downloaded_profile_image(), false); |
| 222 |
| 223 user_manager->DownloadProfileImage(); |
| 224 } |
| 225 |
| 218 void ChangePictureOptionsHandler::HandleSelectImage(const ListValue* args) { | 226 void ChangePictureOptionsHandler::HandleSelectImage(const ListValue* args) { |
| 219 std::string image_url; | 227 std::string image_url; |
| 220 if (!args || | 228 if (!args || |
| 221 args->GetSize() != 1 || | 229 args->GetSize() != 1 || |
| 222 !args->GetString(0, &image_url)) { | 230 !args->GetString(0, &image_url)) { |
| 223 NOTREACHED(); | 231 NOTREACHED(); |
| 224 return; | 232 return; |
| 225 } | 233 } |
| 226 if (image_url.empty()) | 234 if (image_url.empty()) |
| 227 return; | 235 return; |
| 228 | 236 |
| 229 UserManager* user_manager = UserManager::Get(); | 237 UserManager* user_manager = UserManager::Get(); |
| 230 const User& user = user_manager->logged_in_user(); | 238 const User& user = user_manager->logged_in_user(); |
| 231 int image_index = User::kInvalidImageIndex; | 239 int image_index = User::kInvalidImageIndex; |
| 232 | 240 |
| 233 // TODO(ivankr): set profile image from downloaded_profile_image() here. | |
| 234 | |
| 235 if (StartsWithASCII(image_url, chrome::kChromeUIUserImageURL, false)) { | 241 if (StartsWithASCII(image_url, chrome::kChromeUIUserImageURL, false)) { |
| 236 // Image from file/camera uses kChromeUIUserImageURL as URL while | 242 // Image from file/camera uses kChromeUIUserImageURL as URL while |
| 237 // current profile image always has a full data URL. | 243 // current profile image always has a full data URL. |
| 238 // This way transition from (current profile image) to | 244 // This way transition from (current profile image) to |
| 239 // (profile image, current image from file) is easier. | 245 // (profile image, current image from file) is easier. |
| 240 | 246 |
| 241 DCHECK(!previous_image_.empty()); | 247 DCHECK(!previous_image_.empty()); |
| 242 user_manager->SaveUserImage(user.email(), previous_image_); | 248 user_manager->SaveUserImage(user.email(), previous_image_); |
| 243 | 249 |
| 244 UMA_HISTOGRAM_ENUMERATION("UserImage.ChangeChoice", | 250 UMA_HISTOGRAM_ENUMERATION("UserImage.ChangeChoice", |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 CameraDetector::kCameraPresent); | 313 CameraDetector::kCameraPresent); |
| 308 } | 314 } |
| 309 | 315 |
| 310 void ChangePictureOptionsHandler::Observe( | 316 void ChangePictureOptionsHandler::Observe( |
| 311 int type, | 317 int type, |
| 312 const content::NotificationSource& source, | 318 const content::NotificationSource& source, |
| 313 const content::NotificationDetails& details) { | 319 const content::NotificationDetails& details) { |
| 314 OptionsPageUIHandler::Observe(type, source, details); | 320 OptionsPageUIHandler::Observe(type, source, details); |
| 315 if (type == chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED) { | 321 if (type == chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED) { |
| 316 // User profile image has been updated. | 322 // User profile image has been updated. |
| 317 std::string data_url = web_ui_util::GetImageDataUrl( | 323 SendProfileImage(*content::Details<const SkBitmap>(details).ptr(), false); |
| 318 *content::Details<const SkBitmap>(details).ptr()); | |
| 319 base::StringValue data_url_value(data_url); | |
| 320 base::FundamentalValue select(false); | |
| 321 web_ui_->CallJavascriptFunction("ChangePictureOptions.setProfileImage", | |
| 322 data_url_value, select); | |
| 323 } | 324 } |
| 324 } | 325 } |
| 325 | 326 |
| 326 gfx::NativeWindow ChangePictureOptionsHandler::GetBrowserWindow() const { | 327 gfx::NativeWindow ChangePictureOptionsHandler::GetBrowserWindow() const { |
| 327 Browser* browser = | 328 Browser* browser = |
| 328 BrowserList::FindBrowserWithProfile(Profile::FromWebUI(web_ui_)); | 329 BrowserList::FindBrowserWithProfile(Profile::FromWebUI(web_ui_)); |
| 329 if (!browser) | 330 if (!browser) |
| 330 return NULL; | 331 return NULL; |
| 331 return browser->window()->GetNativeHandle(); | 332 return browser->window()->GetNativeHandle(); |
| 332 } | 333 } |
| 333 | 334 |
| 334 } // namespace chromeos | 335 } // namespace chromeos |
| OLD | NEW |