Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/chromeos/login/screens/user_image_screen.h" | 5 #include "chrome/browser/chromeos/login/screens/user_image_screen.h" |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "chrome/browser/chromeos/accessibility/accessibility_util.h" | 9 #include "chrome/browser/chromeos/accessibility/accessibility_util.h" |
| 10 #include "chrome/browser/chromeos/login/default_user_images.h" | 10 #include "chrome/browser/chromeos/login/default_user_images.h" |
| 11 #include "chrome/browser/chromeos/login/login_utils.h" | 11 #include "chrome/browser/chromeos/login/login_utils.h" |
| 12 #include "chrome/browser/chromeos/login/screens/screen_observer.h" | 12 #include "chrome/browser/chromeos/login/screens/screen_observer.h" |
| 13 #include "chrome/browser/chromeos/login/user_image.h" | 13 #include "chrome/browser/chromeos/login/user_image.h" |
| 14 #include "chrome/browser/chromeos/login/user_image_manager.h" | 14 #include "chrome/browser/chromeos/login/user_image_manager.h" |
| 15 #include "chrome/browser/chromeos/login/user_manager.h" | 15 #include "chrome/browser/chromeos/login/user_manager.h" |
| 16 #include "chrome/browser/chromeos/login/wizard_controller.h" | 16 #include "chrome/browser/chromeos/login/wizard_controller.h" |
| 17 #include "chrome/common/chrome_notification_types.h" | 17 #include "chrome/common/chrome_notification_types.h" |
| 18 #include "content/public/browser/notification_service.h" | 18 #include "content/public/browser/notification_service.h" |
| 19 #include "grit/generated_resources.h" | 19 #include "grit/generated_resources.h" |
| 20 #include "grit/theme_resources.h" | 20 #include "grit/theme_resources.h" |
| 21 #include "third_party/skia/include/core/SkBitmap.h" | 21 #include "third_party/skia/include/core/SkBitmap.h" |
| 22 #include "ui/base/l10n/l10n_util.h" | 22 #include "ui/base/l10n/l10n_util.h" |
| 23 #include "ui/base/resource/resource_bundle.h" | 23 #include "ui/base/resource/resource_bundle.h" |
| 24 #include "ui/gfx/image/image_skia.h" | 24 #include "ui/gfx/image/image_skia.h" |
| 25 #include "ui/webui/web_ui_util.h" | |
| 26 | |
| 27 using content::BrowserThread; | |
| 25 | 28 |
| 26 namespace chromeos { | 29 namespace chromeos { |
| 27 | 30 |
| 28 namespace { | 31 namespace { |
| 29 | 32 |
| 30 // Time histogram suffix for profile image download. | 33 // Time histogram suffix for profile image download. |
| 31 const char kProfileDownloadReason[] = "OOBE"; | 34 const char kProfileDownloadReason[] = "OOBE"; |
| 32 | 35 |
| 33 } // namespace | 36 } // namespace |
| 34 | 37 |
| 35 UserImageScreen::UserImageScreen(ScreenObserver* screen_observer, | 38 UserImageScreen::UserImageScreen(ScreenObserver* screen_observer, |
| 36 UserImageScreenActor* actor) | 39 UserImageScreenActor* actor) |
| 37 : WizardScreen(screen_observer), | 40 : WizardScreen(screen_observer), |
| 38 actor_(actor), | 41 actor_(actor), |
| 39 profile_picture_enabled_(false) { | 42 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), |
| 43 accept_photo_after_decoding_(false), | |
| 44 selected_image_(User::kInvalidImageIndex), | |
| 45 profile_picture_enabled_(false), | |
| 46 profile_picture_data_url_(chrome::kAboutBlankURL), | |
| 47 profile_picture_absent_(false) { | |
| 40 actor_->SetDelegate(this); | 48 actor_->SetDelegate(this); |
| 41 SetProfilePictureEnabled(true); | 49 SetProfilePictureEnabled(true); |
| 42 } | 50 } |
| 43 | 51 |
| 44 UserImageScreen::~UserImageScreen() { | 52 UserImageScreen::~UserImageScreen() { |
| 45 if (actor_) | 53 if (actor_) |
| 46 actor_->SetDelegate(NULL); | 54 actor_->SetDelegate(NULL); |
| 55 if (image_decoder_.get()) | |
| 56 image_decoder_->set_delegate(NULL); | |
| 47 } | 57 } |
| 48 | 58 |
| 59 void UserImageScreen::CheckCameraPresence() { | |
| 60 CameraDetector::StartPresenceCheck( | |
| 61 base::Bind(&UserImageScreen::OnCameraPresenceCheckDone, | |
| 62 weak_factory_.GetWeakPtr())); | |
| 63 } | |
| 64 | |
| 65 void UserImageScreen::OnCameraPresenceCheckDone() { | |
| 66 if (actor_) | |
|
Denis Kuznetsov (DE-MUC)
2013/04/17 14:49:16
{}
| |
| 67 actor_->SetCameraPresent( | |
| 68 CameraDetector::camera_presence() == CameraDetector::kCameraPresent); | |
| 69 } | |
| 70 | |
| 71 void UserImageScreen::OnPhotoTaken(const std::string& raw_data) { | |
| 72 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 73 user_photo_ = gfx::ImageSkia(); | |
| 74 if (image_decoder_.get()) | |
| 75 image_decoder_->set_delegate(NULL); | |
| 76 image_decoder_ = new ImageDecoder(this, raw_data, | |
| 77 ImageDecoder::DEFAULT_CODEC); | |
| 78 scoped_refptr<base::MessageLoopProxy> task_runner = | |
| 79 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI); | |
| 80 image_decoder_->Start(task_runner); | |
| 81 } | |
| 82 | |
| 83 void UserImageScreen::OnImageDecoded(const ImageDecoder* decoder, | |
| 84 const SkBitmap& decoded_image) { | |
| 85 DCHECK_EQ(image_decoder_.get(), decoder); | |
| 86 user_photo_ = gfx::ImageSkia::CreateFrom1xBitmap(decoded_image); | |
| 87 if (accept_photo_after_decoding_) | |
| 88 OnImageAccepted(); | |
| 89 } | |
| 90 | |
| 91 void UserImageScreen::OnDecodeImageFailed(const ImageDecoder* decoder) { | |
| 92 NOTREACHED() << "Failed to decode PNG image from WebUI"; | |
| 93 } | |
| 94 | |
| 95 void UserImageScreen::OnImageSelected(const std::string& image_type, | |
| 96 const std::string& image_url) { | |
| 97 if (image_url.empty()) | |
| 98 return; | |
| 99 int user_image_index = User::kInvalidImageIndex; | |
| 100 if (image_type == "default" && | |
| 101 IsDefaultImageUrl(image_url, &user_image_index)) { | |
| 102 selected_image_ = user_image_index; | |
| 103 } else if (image_type == "camera") { | |
| 104 selected_image_ = User::kExternalImageIndex; | |
| 105 } else if (image_type == "profile") { | |
| 106 selected_image_ = User::kProfileImageIndex; | |
| 107 } else { | |
| 108 NOTREACHED() << "Unexpected image type: " << image_type; | |
| 109 } | |
| 110 } | |
| 111 | |
| 112 void UserImageScreen::OnImageAccepted() { | |
| 113 UserManager* user_manager = UserManager::Get(); | |
| 114 UserImageManager* image_manager = user_manager->GetUserImageManager(); | |
| 115 std::string user_id = GetUser()->email(); | |
| 116 int uma_index = 0; | |
| 117 switch (selected_image_) { | |
| 118 case User::kExternalImageIndex: | |
| 119 // Photo decoding may not have been finished yet. | |
| 120 if (user_photo_.isNull()) { | |
| 121 accept_photo_after_decoding_ = true; | |
| 122 return; | |
| 123 } | |
| 124 image_manager-> | |
| 125 SaveUserImage(user_id, UserImage::CreateAndEncode(user_photo_)); | |
| 126 uma_index = kHistogramImageFromCamera; | |
| 127 break; | |
| 128 case User::kProfileImageIndex: | |
| 129 image_manager->SaveUserImageFromProfileImage(user_id); | |
| 130 uma_index = kHistogramImageFromProfile; | |
| 131 break; | |
| 132 default: | |
| 133 DCHECK(selected_image_ >= 0 && selected_image_ < kDefaultImagesCount); | |
| 134 image_manager->SaveUserDefaultImageIndex(user_id, selected_image_); | |
| 135 uma_index = GetDefaultImageHistogramValue(selected_image_); | |
| 136 } | |
| 137 UMA_HISTOGRAM_ENUMERATION("UserImage.FirstTimeChoice", | |
| 138 uma_index, | |
| 139 kHistogramImagesCount); | |
| 140 get_screen_observer()->OnExit(ScreenObserver::USER_IMAGE_SELECTED); | |
| 141 } | |
| 142 | |
| 143 | |
| 49 void UserImageScreen::SetProfilePictureEnabled(bool profile_picture_enabled) { | 144 void UserImageScreen::SetProfilePictureEnabled(bool profile_picture_enabled) { |
| 50 if (profile_picture_enabled_ == profile_picture_enabled) | 145 if (profile_picture_enabled_ == profile_picture_enabled) |
| 51 return; | 146 return; |
| 52 profile_picture_enabled_ = profile_picture_enabled; | 147 profile_picture_enabled_ = profile_picture_enabled; |
| 53 if (profile_picture_enabled) { | 148 if (profile_picture_enabled) { |
| 54 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED, | 149 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED, |
| 55 content::NotificationService::AllSources()); | 150 content::NotificationService::AllSources()); |
| 56 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATE_FAILED, | 151 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATE_FAILED, |
| 57 content::NotificationService::AllSources()); | 152 content::NotificationService::AllSources()); |
| 58 } else { | 153 } else { |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 83 return user; | 178 return user; |
| 84 } | 179 } |
| 85 | 180 |
| 86 void UserImageScreen::Show() { | 181 void UserImageScreen::Show() { |
| 87 if (!actor_) | 182 if (!actor_) |
| 88 return; | 183 return; |
| 89 | 184 |
| 90 actor_->Show(); | 185 actor_->Show(); |
| 91 actor_->SetProfilePictureEnabled(profile_picture_enabled_); | 186 actor_->SetProfilePictureEnabled(profile_picture_enabled_); |
| 92 | 187 |
| 93 actor_->SelectImage(GetUser()->image_index()); | 188 selected_image_ = GetUser()->image_index(); |
| 189 actor_->SelectImage(selected_image_); | |
| 94 | 190 |
| 95 if (profile_picture_enabled_) { | 191 if (profile_picture_enabled_) { |
| 96 // Start fetching the profile image. | 192 // Start fetching the profile image. |
| 97 UserManager::Get()->GetUserImageManager()-> | 193 UserManager::Get()->GetUserImageManager()-> |
| 98 DownloadProfileImage(kProfileDownloadReason); | 194 DownloadProfileImage(kProfileDownloadReason); |
| 99 } | 195 } |
| 100 | 196 |
| 101 accessibility::MaybeSpeak( | 197 accessibility::MaybeSpeak( |
| 102 l10n_util::GetStringUTF8(IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TEXT)); | 198 l10n_util::GetStringUTF8(IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TEXT)); |
| 103 } | 199 } |
| 104 | 200 |
| 105 void UserImageScreen::Hide() { | 201 void UserImageScreen::Hide() { |
| 106 if (actor_) | 202 if (actor_) |
| 107 actor_->Hide(); | 203 actor_->Hide(); |
| 108 } | 204 } |
| 109 | 205 |
| 110 std::string UserImageScreen::GetName() const { | 206 std::string UserImageScreen::GetName() const { |
| 111 return WizardController::kUserImageScreenName; | 207 return WizardController::kUserImageScreenName; |
| 112 } | 208 } |
| 113 | 209 |
| 114 void UserImageScreen::OnPhotoTaken(const gfx::ImageSkia& image) { | |
| 115 UserManager* user_manager = UserManager::Get(); | |
| 116 user_manager->GetUserImageManager()->SaveUserImage( | |
| 117 GetUser()->email(), | |
| 118 UserImage::CreateAndEncode(image)); | |
| 119 | |
| 120 get_screen_observer()->OnExit(ScreenObserver::USER_IMAGE_SELECTED); | |
| 121 | |
| 122 UMA_HISTOGRAM_ENUMERATION("UserImage.FirstTimeChoice", | |
| 123 kHistogramImageFromCamera, | |
| 124 kHistogramImagesCount); | |
| 125 } | |
| 126 | |
| 127 void UserImageScreen::OnProfileImageSelected() { | |
| 128 UserManager* user_manager = UserManager::Get(); | |
| 129 user_manager->GetUserImageManager()->SaveUserImageFromProfileImage( | |
| 130 GetUser()->email()); | |
| 131 | |
| 132 get_screen_observer()->OnExit(ScreenObserver::USER_IMAGE_SELECTED); | |
| 133 | |
| 134 UMA_HISTOGRAM_ENUMERATION("UserImage.FirstTimeChoice", | |
| 135 kHistogramImageFromProfile, | |
| 136 kHistogramImagesCount); | |
| 137 } | |
| 138 | |
| 139 void UserImageScreen::OnDefaultImageSelected(int index) { | |
| 140 UserManager* user_manager = UserManager::Get(); | |
| 141 user_manager->GetUserImageManager()->SaveUserDefaultImageIndex( | |
| 142 GetUser()->email(), index); | |
| 143 | |
| 144 get_screen_observer()->OnExit(ScreenObserver::USER_IMAGE_SELECTED); | |
| 145 | |
| 146 UMA_HISTOGRAM_ENUMERATION("UserImage.FirstTimeChoice", | |
| 147 GetDefaultImageHistogramValue(index), | |
| 148 kHistogramImagesCount); | |
| 149 } | |
| 150 | |
| 151 void UserImageScreen::OnActorDestroyed(UserImageScreenActor* actor) { | 210 void UserImageScreen::OnActorDestroyed(UserImageScreenActor* actor) { |
| 152 if (actor_ == actor) | 211 if (actor_ == actor) |
| 153 actor_ = NULL; | 212 actor_ = NULL; |
| 154 } | 213 } |
| 155 | 214 |
| 156 void UserImageScreen::Observe(int type, | 215 void UserImageScreen::Observe(int type, |
| 157 const content::NotificationSource& source, | 216 const content::NotificationSource& source, |
| 158 const content::NotificationDetails& details) { | 217 const content::NotificationDetails& details) { |
| 159 DCHECK(profile_picture_enabled_); | 218 DCHECK(profile_picture_enabled_); |
| 160 switch (type) { | 219 switch (type) { |
| 161 case chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED: { | 220 case chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED: { |
| 162 // We've got a new profile image. | 221 // We've got a new profile image. |
| 163 if (actor_) { | 222 profile_picture_data_url_ = webui::GetBitmapDataUrl( |
| 164 actor_->AddProfileImage( | 223 *content::Details<const gfx::ImageSkia>(details).ptr()->bitmap()); |
| 165 *content::Details<const gfx::ImageSkia>(details).ptr()); | 224 if (actor_) |
| 166 } | 225 actor_->SendProfileImage(profile_picture_data_url_); |
| 167 break; | 226 break; |
| 168 } | 227 } |
| 169 case chrome::NOTIFICATION_PROFILE_IMAGE_UPDATE_FAILED: { | 228 case chrome::NOTIFICATION_PROFILE_IMAGE_UPDATE_FAILED: { |
| 170 // User has a default profile image or fetching profile image has failed. | 229 // User has a default profile image or fetching profile image has failed. |
| 230 profile_picture_absent_ = true; | |
| 171 if (actor_) | 231 if (actor_) |
| 172 actor_->OnProfileImageAbsent(); | 232 actor_->OnProfileImageAbsent(); |
| 173 break; | 233 break; |
| 174 } | 234 } |
| 175 default: | 235 default: |
| 176 NOTREACHED(); | 236 NOTREACHED(); |
| 177 } | 237 } |
| 178 } | 238 } |
| 179 | 239 |
| 240 bool UserImageScreen::profile_picture_absent() { | |
| 241 return profile_picture_absent_; | |
| 242 } | |
| 243 | |
| 244 int UserImageScreen::selected_image() { | |
| 245 return selected_image_; | |
| 246 } | |
| 247 | |
| 248 std::string UserImageScreen::profile_picture_data_url() { | |
| 249 return profile_picture_data_url_; | |
| 250 } | |
| 251 | |
|
Denis Kuznetsov (DE-MUC)
2013/04/17 14:49:16
empty line
| |
| 252 | |
| 180 } // namespace chromeos | 253 } // namespace chromeos |
| OLD | NEW |