Chromium Code Reviews| Index: chrome/browser/chromeos/login/screens/user_image_screen.cc |
| diff --git a/chrome/browser/chromeos/login/screens/user_image_screen.cc b/chrome/browser/chromeos/login/screens/user_image_screen.cc |
| index e403d0670e7753ac3655e45827276463ca8b4870..6b01fb1cc210ed2ddb8b883bb9958d3e87c6f8a9 100644 |
| --- a/chrome/browser/chromeos/login/screens/user_image_screen.cc |
| +++ b/chrome/browser/chromeos/login/screens/user_image_screen.cc |
| @@ -22,6 +22,9 @@ |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/gfx/image/image_skia.h" |
| +#include "ui/webui/web_ui_util.h" |
| + |
| +using content::BrowserThread; |
| namespace chromeos { |
| @@ -36,7 +39,12 @@ UserImageScreen::UserImageScreen(ScreenObserver* screen_observer, |
| UserImageScreenActor* actor) |
| : WizardScreen(screen_observer), |
| actor_(actor), |
| - profile_picture_enabled_(false) { |
| + ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), |
| + accept_photo_after_decoding_(false), |
| + selected_image_(User::kInvalidImageIndex), |
| + profile_picture_enabled_(false), |
| + profile_picture_data_url_(chrome::kAboutBlankURL), |
| + profile_picture_absent_(false) { |
| actor_->SetDelegate(this); |
| SetProfilePictureEnabled(true); |
| } |
| @@ -44,8 +52,95 @@ UserImageScreen::UserImageScreen(ScreenObserver* screen_observer, |
| UserImageScreen::~UserImageScreen() { |
| if (actor_) |
| actor_->SetDelegate(NULL); |
| + if (image_decoder_.get()) |
| + image_decoder_->set_delegate(NULL); |
| +} |
| + |
| +void UserImageScreen::CheckCameraPresence() { |
| + CameraDetector::StartPresenceCheck( |
| + base::Bind(&UserImageScreen::OnCameraPresenceCheckDone, |
| + weak_factory_.GetWeakPtr())); |
| +} |
| + |
| +void UserImageScreen::OnCameraPresenceCheckDone() { |
| + if (actor_) |
|
Denis Kuznetsov (DE-MUC)
2013/04/17 14:49:16
{}
|
| + actor_->SetCameraPresent( |
| + CameraDetector::camera_presence() == CameraDetector::kCameraPresent); |
| +} |
| + |
| +void UserImageScreen::OnPhotoTaken(const std::string& raw_data) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + user_photo_ = gfx::ImageSkia(); |
| + if (image_decoder_.get()) |
| + image_decoder_->set_delegate(NULL); |
| + image_decoder_ = new ImageDecoder(this, raw_data, |
| + ImageDecoder::DEFAULT_CODEC); |
| + scoped_refptr<base::MessageLoopProxy> task_runner = |
| + BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI); |
| + image_decoder_->Start(task_runner); |
| } |
| +void UserImageScreen::OnImageDecoded(const ImageDecoder* decoder, |
| + const SkBitmap& decoded_image) { |
| + DCHECK_EQ(image_decoder_.get(), decoder); |
| + user_photo_ = gfx::ImageSkia::CreateFrom1xBitmap(decoded_image); |
| + if (accept_photo_after_decoding_) |
| + OnImageAccepted(); |
| +} |
| + |
| +void UserImageScreen::OnDecodeImageFailed(const ImageDecoder* decoder) { |
| + NOTREACHED() << "Failed to decode PNG image from WebUI"; |
| +} |
| + |
| +void UserImageScreen::OnImageSelected(const std::string& image_type, |
| + const std::string& image_url) { |
| + if (image_url.empty()) |
| + return; |
| + int user_image_index = User::kInvalidImageIndex; |
| + if (image_type == "default" && |
| + IsDefaultImageUrl(image_url, &user_image_index)) { |
| + selected_image_ = user_image_index; |
| + } else if (image_type == "camera") { |
| + selected_image_ = User::kExternalImageIndex; |
| + } else if (image_type == "profile") { |
| + selected_image_ = User::kProfileImageIndex; |
| + } else { |
| + NOTREACHED() << "Unexpected image type: " << image_type; |
| + } |
| +} |
| + |
| +void UserImageScreen::OnImageAccepted() { |
| + UserManager* user_manager = UserManager::Get(); |
| + UserImageManager* image_manager = user_manager->GetUserImageManager(); |
| + std::string user_id = GetUser()->email(); |
| + int uma_index = 0; |
| + switch (selected_image_) { |
| + case User::kExternalImageIndex: |
| + // Photo decoding may not have been finished yet. |
| + if (user_photo_.isNull()) { |
| + accept_photo_after_decoding_ = true; |
| + return; |
| + } |
| + image_manager-> |
| + SaveUserImage(user_id, UserImage::CreateAndEncode(user_photo_)); |
| + uma_index = kHistogramImageFromCamera; |
| + break; |
| + case User::kProfileImageIndex: |
| + image_manager->SaveUserImageFromProfileImage(user_id); |
| + uma_index = kHistogramImageFromProfile; |
| + break; |
| + default: |
| + DCHECK(selected_image_ >= 0 && selected_image_ < kDefaultImagesCount); |
| + image_manager->SaveUserDefaultImageIndex(user_id, selected_image_); |
| + uma_index = GetDefaultImageHistogramValue(selected_image_); |
| + } |
| + UMA_HISTOGRAM_ENUMERATION("UserImage.FirstTimeChoice", |
| + uma_index, |
| + kHistogramImagesCount); |
| + get_screen_observer()->OnExit(ScreenObserver::USER_IMAGE_SELECTED); |
| +} |
| + |
| + |
| void UserImageScreen::SetProfilePictureEnabled(bool profile_picture_enabled) { |
| if (profile_picture_enabled_ == profile_picture_enabled) |
| return; |
| @@ -90,7 +185,8 @@ void UserImageScreen::Show() { |
| actor_->Show(); |
| actor_->SetProfilePictureEnabled(profile_picture_enabled_); |
| - actor_->SelectImage(GetUser()->image_index()); |
| + selected_image_ = GetUser()->image_index(); |
| + actor_->SelectImage(selected_image_); |
| if (profile_picture_enabled_) { |
| // Start fetching the profile image. |
| @@ -111,43 +207,6 @@ std::string UserImageScreen::GetName() const { |
| return WizardController::kUserImageScreenName; |
| } |
| -void UserImageScreen::OnPhotoTaken(const gfx::ImageSkia& image) { |
| - UserManager* user_manager = UserManager::Get(); |
| - user_manager->GetUserImageManager()->SaveUserImage( |
| - GetUser()->email(), |
| - UserImage::CreateAndEncode(image)); |
| - |
| - get_screen_observer()->OnExit(ScreenObserver::USER_IMAGE_SELECTED); |
| - |
| - UMA_HISTOGRAM_ENUMERATION("UserImage.FirstTimeChoice", |
| - kHistogramImageFromCamera, |
| - kHistogramImagesCount); |
| -} |
| - |
| -void UserImageScreen::OnProfileImageSelected() { |
| - UserManager* user_manager = UserManager::Get(); |
| - user_manager->GetUserImageManager()->SaveUserImageFromProfileImage( |
| - GetUser()->email()); |
| - |
| - get_screen_observer()->OnExit(ScreenObserver::USER_IMAGE_SELECTED); |
| - |
| - UMA_HISTOGRAM_ENUMERATION("UserImage.FirstTimeChoice", |
| - kHistogramImageFromProfile, |
| - kHistogramImagesCount); |
| -} |
| - |
| -void UserImageScreen::OnDefaultImageSelected(int index) { |
| - UserManager* user_manager = UserManager::Get(); |
| - user_manager->GetUserImageManager()->SaveUserDefaultImageIndex( |
| - GetUser()->email(), index); |
| - |
| - get_screen_observer()->OnExit(ScreenObserver::USER_IMAGE_SELECTED); |
| - |
| - UMA_HISTOGRAM_ENUMERATION("UserImage.FirstTimeChoice", |
| - GetDefaultImageHistogramValue(index), |
| - kHistogramImagesCount); |
| -} |
| - |
| void UserImageScreen::OnActorDestroyed(UserImageScreenActor* actor) { |
| if (actor_ == actor) |
| actor_ = NULL; |
| @@ -160,14 +219,15 @@ void UserImageScreen::Observe(int type, |
| switch (type) { |
| case chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED: { |
| // We've got a new profile image. |
| - if (actor_) { |
| - actor_->AddProfileImage( |
| - *content::Details<const gfx::ImageSkia>(details).ptr()); |
| - } |
| + profile_picture_data_url_ = webui::GetBitmapDataUrl( |
| + *content::Details<const gfx::ImageSkia>(details).ptr()->bitmap()); |
| + if (actor_) |
| + actor_->SendProfileImage(profile_picture_data_url_); |
| break; |
| } |
| case chrome::NOTIFICATION_PROFILE_IMAGE_UPDATE_FAILED: { |
| // User has a default profile image or fetching profile image has failed. |
| + profile_picture_absent_ = true; |
| if (actor_) |
| actor_->OnProfileImageAbsent(); |
| break; |
| @@ -177,4 +237,17 @@ void UserImageScreen::Observe(int type, |
| } |
| } |
| +bool UserImageScreen::profile_picture_absent() { |
| + return profile_picture_absent_; |
| +} |
| + |
| +int UserImageScreen::selected_image() { |
| + return selected_image_; |
| +} |
| + |
| +std::string UserImageScreen::profile_picture_data_url() { |
| + return profile_picture_data_url_; |
| +} |
| + |
|
Denis Kuznetsov (DE-MUC)
2013/04/17 14:49:16
empty line
|
| + |
| } // namespace chromeos |