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

Unified Diff: chrome/browser/chromeos/login/screens/user_image_screen.cc

Issue 14063017: Move logic in UserImageScreen from UserImageScreenHandler (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge Created 7 years, 8 months 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698