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

Side by Side 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: Whitespaces and braces 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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_) {
67 actor_->SetCameraPresent(
68 CameraDetector::camera_presence() == CameraDetector::kCameraPresent);
69 }
70 }
71
72 void UserImageScreen::OnPhotoTaken(const std::string& raw_data) {
73 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
74 user_photo_ = gfx::ImageSkia();
75 if (image_decoder_.get())
76 image_decoder_->set_delegate(NULL);
77 image_decoder_ = new ImageDecoder(this, raw_data,
78 ImageDecoder::DEFAULT_CODEC);
79 scoped_refptr<base::MessageLoopProxy> task_runner =
80 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
81 image_decoder_->Start(task_runner);
82 }
83
84 void UserImageScreen::OnImageDecoded(const ImageDecoder* decoder,
85 const SkBitmap& decoded_image) {
86 DCHECK_EQ(image_decoder_.get(), decoder);
87 user_photo_ = gfx::ImageSkia::CreateFrom1xBitmap(decoded_image);
88 if (accept_photo_after_decoding_)
89 OnImageAccepted();
90 }
91
92 void UserImageScreen::OnDecodeImageFailed(const ImageDecoder* decoder) {
93 NOTREACHED() << "Failed to decode PNG image from WebUI";
94 }
95
96 void UserImageScreen::OnImageSelected(const std::string& image_type,
97 const std::string& image_url) {
98 if (image_url.empty())
99 return;
100 int user_image_index = User::kInvalidImageIndex;
101 if (image_type == "default" &&
102 IsDefaultImageUrl(image_url, &user_image_index)) {
103 selected_image_ = user_image_index;
104 } else if (image_type == "camera") {
105 selected_image_ = User::kExternalImageIndex;
106 } else if (image_type == "profile") {
107 selected_image_ = User::kProfileImageIndex;
108 } else {
109 NOTREACHED() << "Unexpected image type: " << image_type;
110 }
111 }
112
113 void UserImageScreen::OnImageAccepted() {
114 UserManager* user_manager = UserManager::Get();
115 UserImageManager* image_manager = user_manager->GetUserImageManager();
116 std::string user_id = GetUser()->email();
117 int uma_index = 0;
118 switch (selected_image_) {
119 case User::kExternalImageIndex:
120 // Photo decoding may not have been finished yet.
121 if (user_photo_.isNull()) {
122 accept_photo_after_decoding_ = true;
123 return;
124 }
125 image_manager->
126 SaveUserImage(user_id, UserImage::CreateAndEncode(user_photo_));
127 uma_index = kHistogramImageFromCamera;
128 break;
129 case User::kProfileImageIndex:
130 image_manager->SaveUserImageFromProfileImage(user_id);
131 uma_index = kHistogramImageFromProfile;
132 break;
133 default:
134 DCHECK(selected_image_ >= 0 && selected_image_ < kDefaultImagesCount);
135 image_manager->SaveUserDefaultImageIndex(user_id, selected_image_);
136 uma_index = GetDefaultImageHistogramValue(selected_image_);
ygorshenin1 2013/04/18 08:12:30 Add "break" here.
137 }
138 UMA_HISTOGRAM_ENUMERATION("UserImage.FirstTimeChoice",
139 uma_index,
140 kHistogramImagesCount);
141 get_screen_observer()->OnExit(ScreenObserver::USER_IMAGE_SELECTED);
142 }
143
144
49 void UserImageScreen::SetProfilePictureEnabled(bool profile_picture_enabled) { 145 void UserImageScreen::SetProfilePictureEnabled(bool profile_picture_enabled) {
50 if (profile_picture_enabled_ == profile_picture_enabled) 146 if (profile_picture_enabled_ == profile_picture_enabled)
51 return; 147 return;
52 profile_picture_enabled_ = profile_picture_enabled; 148 profile_picture_enabled_ = profile_picture_enabled;
53 if (profile_picture_enabled) { 149 if (profile_picture_enabled) {
54 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED, 150 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED,
55 content::NotificationService::AllSources()); 151 content::NotificationService::AllSources());
56 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATE_FAILED, 152 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATE_FAILED,
57 content::NotificationService::AllSources()); 153 content::NotificationService::AllSources());
58 } else { 154 } else {
(...skipping 24 matching lines...) Expand all
83 return user; 179 return user;
84 } 180 }
85 181
86 void UserImageScreen::Show() { 182 void UserImageScreen::Show() {
87 if (!actor_) 183 if (!actor_)
88 return; 184 return;
89 185
90 actor_->Show(); 186 actor_->Show();
91 actor_->SetProfilePictureEnabled(profile_picture_enabled_); 187 actor_->SetProfilePictureEnabled(profile_picture_enabled_);
92 188
93 actor_->SelectImage(GetUser()->image_index()); 189 selected_image_ = GetUser()->image_index();
190 actor_->SelectImage(selected_image_);
94 191
95 if (profile_picture_enabled_) { 192 if (profile_picture_enabled_) {
96 // Start fetching the profile image. 193 // Start fetching the profile image.
97 UserManager::Get()->GetUserImageManager()-> 194 UserManager::Get()->GetUserImageManager()->
98 DownloadProfileImage(kProfileDownloadReason); 195 DownloadProfileImage(kProfileDownloadReason);
99 } 196 }
100 197
101 accessibility::MaybeSpeak( 198 accessibility::MaybeSpeak(
102 l10n_util::GetStringUTF8(IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TEXT)); 199 l10n_util::GetStringUTF8(IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TEXT));
103 } 200 }
104 201
105 void UserImageScreen::Hide() { 202 void UserImageScreen::Hide() {
106 if (actor_) 203 if (actor_)
107 actor_->Hide(); 204 actor_->Hide();
108 } 205 }
109 206
110 std::string UserImageScreen::GetName() const { 207 std::string UserImageScreen::GetName() const {
111 return WizardController::kUserImageScreenName; 208 return WizardController::kUserImageScreenName;
112 } 209 }
113 210
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) { 211 void UserImageScreen::OnActorDestroyed(UserImageScreenActor* actor) {
152 if (actor_ == actor) 212 if (actor_ == actor)
153 actor_ = NULL; 213 actor_ = NULL;
154 } 214 }
155 215
156 void UserImageScreen::Observe(int type, 216 void UserImageScreen::Observe(int type,
157 const content::NotificationSource& source, 217 const content::NotificationSource& source,
158 const content::NotificationDetails& details) { 218 const content::NotificationDetails& details) {
159 DCHECK(profile_picture_enabled_); 219 DCHECK(profile_picture_enabled_);
160 switch (type) { 220 switch (type) {
161 case chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED: { 221 case chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED: {
162 // We've got a new profile image. 222 // We've got a new profile image.
163 if (actor_) { 223 profile_picture_data_url_ = webui::GetBitmapDataUrl(
164 actor_->AddProfileImage( 224 *content::Details<const gfx::ImageSkia>(details).ptr()->bitmap());
165 *content::Details<const gfx::ImageSkia>(details).ptr()); 225 if (actor_)
166 } 226 actor_->SendProfileImage(profile_picture_data_url_);
167 break; 227 break;
168 } 228 }
169 case chrome::NOTIFICATION_PROFILE_IMAGE_UPDATE_FAILED: { 229 case chrome::NOTIFICATION_PROFILE_IMAGE_UPDATE_FAILED: {
170 // User has a default profile image or fetching profile image has failed. 230 // User has a default profile image or fetching profile image has failed.
231 profile_picture_absent_ = true;
171 if (actor_) 232 if (actor_)
172 actor_->OnProfileImageAbsent(); 233 actor_->OnProfileImageAbsent();
173 break; 234 break;
174 } 235 }
175 default: 236 default:
176 NOTREACHED(); 237 NOTREACHED();
177 } 238 }
178 } 239 }
179 240
241 bool UserImageScreen::profile_picture_absent() {
Nikita (slow) 2013/04/17 20:28:04 these seem like simple getters so could be moved t
Denis Kuznetsov (DE-MUC) 2013/04/18 02:57:50 They are virtual, so they can not be in header. An
ygorshenin1 2013/04/18 08:12:30 As they're virtual, their names must be in CamelCa
Denis Kuznetsov (DE-MUC) 2013/04/18 08:48:46 They will be gone in couple of days.
242 return profile_picture_absent_;
243 }
244
245 int UserImageScreen::selected_image() {
246 return selected_image_;
247 }
248
249 std::string UserImageScreen::profile_picture_data_url() {
250 return profile_picture_data_url_;
251 }
252
180 } // namespace chromeos 253 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698