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 |