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_) { | |
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 Loading... | |
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 |
OLD | NEW |