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..f0daa9e00145718fce3516a93fc9e92c9fafed02 100644 |
--- a/chrome/browser/chromeos/login/screens/user_image_screen.cc |
+++ b/chrome/browser/chromeos/login/screens/user_image_screen.cc |
@@ -7,6 +7,7 @@ |
#include "base/compiler_specific.h" |
#include "base/metrics/histogram.h" |
#include "chrome/browser/chromeos/accessibility/accessibility_util.h" |
+#include "chrome/browser/chromeos/camera_detector.h" |
#include "chrome/browser/chromeos/login/default_user_images.h" |
#include "chrome/browser/chromeos/login/login_utils.h" |
#include "chrome/browser/chromeos/login/screens/screen_observer.h" |
@@ -15,6 +16,8 @@ |
#include "chrome/browser/chromeos/login/user_manager.h" |
#include "chrome/browser/chromeos/login/wizard_controller.h" |
#include "chrome/common/chrome_notification_types.h" |
+#include "chrome/common/url_constants.h" |
+#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/notification_service.h" |
#include "grit/generated_resources.h" |
#include "grit/theme_resources.h" |
@@ -22,6 +25,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 +42,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 +55,97 @@ 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_) { |
+ 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_); |
+ break; |
+ } |
+ 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 +190,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 +212,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 +224,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 +242,16 @@ 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_; |
+} |
+ |
} // namespace chromeos |