Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(803)

Side by Side Diff: chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.cc

Issue 8541002: [cros] Initial user image loading and repeated profile image loading fixes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Whitespace Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698