1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h" 6 7 #include "base/command_line.h" 8 #include "base/logging.h" 9 #include "base/metrics/histogram.h" 10 #include "base/values.h" 11 #include "chrome/browser/chromeos/login/default_user_images.h" 12 #include "chrome/browser/chromeos/login/user.h" 13 #include "chrome/browser/chromeos/login/webui_login_display.h" 14 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" 15 #include "chrome/common/chrome_switches.h" 16 #include "chrome/common/url_constants.h" 17 #include "grit/generated_resources.h" 18 #include "net/base/data_url.h" 19 #include "ui/base/l10n/l10n_util.h" 20 #include "url/gurl.h" 21 22 namespace { 23 24 const char kJsScreenPath[] = "login.UserImageScreen"; 25 26 } // namespace 27 28 namespace chromeos { 29 30 UserImageScreenHandler::UserImageScreenHandler() 31 : BaseScreenHandler(kJsScreenPath), 32 screen_(NULL), 33 show_on_init_(false) { 34 } 35 36 UserImageScreenHandler::~UserImageScreenHandler() { 37 if (screen_) 38 screen_->OnActorDestroyed(this); 39 } 40 41 void UserImageScreenHandler::Initialize() { 42 if (show_on_init_) { 43 Show(); 44 show_on_init_ = false; 45 } 46 } 47 48 void UserImageScreenHandler::SetDelegate( 49 UserImageScreenActor::Delegate* screen) { 50 screen_ = screen; 51 } 52 53 void UserImageScreenHandler::Show() { 54 if (!page_is_ready()) { 55 show_on_init_ = true; 56 return; 57 } 58 screen_show_time_ = base::Time::Now(); 59 ShowScreen(OobeUI::kScreenUserImagePicker, NULL); 60 61 // When shown, query camera presence. 62 if (!screen_) 63 return; 64 screen_->CheckCameraPresence(); 65 } 66 67 void UserImageScreenHandler::Hide() { 68 } 69 70 void UserImageScreenHandler::PrepareToShow() { 71 } 72 73 void UserImageScreenHandler::DeclareLocalizedValues( 74 LocalizedValuesBuilder* builder) { 75 // TODO(ivankr): string should be renamed to something like 76 // IDS_USER_IMAGE_SCREEN_TITLE (currently used for Take Photo dialog). 77 builder->Add("userImageScreenTitle", IDS_OOBE_PICTURE); 78 builder->Add("userImageScreenDescription", 79 IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TEXT); 80 builder->Add("takePhoto", IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO); 81 builder->Add("discardPhoto", IDS_OPTIONS_CHANGE_PICTURE_DISCARD_PHOTO); 82 builder->Add("flipPhoto", IDS_OPTIONS_CHANGE_PICTURE_FLIP_PHOTO); 83 builder->Add("profilePhoto", IDS_IMAGE_SCREEN_PROFILE_PHOTO); 84 builder->Add("profilePhotoLoading", 85 IDS_IMAGE_SCREEN_PROFILE_LOADING_PHOTO); 86 builder->Add("okButtonText", IDS_OK); 87 builder->Add("authorCredit", IDS_OPTIONS_SET_WALLPAPER_AUTHOR_TEXT); 88 builder->Add("photoFromCamera", IDS_OPTIONS_CHANGE_PICTURE_PHOTO_FROM_CAMERA); 89 builder->Add("photoCaptureAccessibleText", 90 IDS_OPTIONS_PHOTO_CAPTURE_ACCESSIBLE_TEXT); 91 builder->Add("photoDiscardAccessibleText", 92 IDS_OPTIONS_PHOTO_DISCARD_ACCESSIBLE_TEXT); 93 } 94 95 void UserImageScreenHandler::RegisterMessages() { 96 AddCallback("getImages", &UserImageScreenHandler::HandleGetImages); 97 AddCallback("photoTaken", &UserImageScreenHandler::HandlePhotoTaken); 98 AddCallback("selectImage", &UserImageScreenHandler::HandleSelectImage); 99 AddCallback("checkCameraPresence", 100 &UserImageScreenHandler::HandleCheckCameraPresence); 101 AddCallback("onUserImageAccepted", 102 &UserImageScreenHandler::HandleImageAccepted); 103 AddCallback("onUserImageScreenShown", 104 &UserImageScreenHandler::HandleScreenShown); 105 } 106 107 void UserImageScreenHandler::SelectImage(int index) { 108 if (page_is_ready()) 109 CallJS("setSelectedImage", GetDefaultImageUrl(index)); 110 } 111 112 void UserImageScreenHandler::SendProfileImage(const std::string& data_url) { 113 if (page_is_ready()) 114 CallJS("setProfileImage", data_url); 115 } 116 117 void UserImageScreenHandler::OnProfileImageAbsent() { 118 if (page_is_ready()) { 119 scoped_ptr<base::Value> null_value(base::Value::CreateNullValue()); 120 CallJS("setProfileImage", *null_value); 121 } 122 } 123 124 // TODO(antrim) : It looks more like parameters for "Init" rather than callback. 125 void UserImageScreenHandler::HandleGetImages() { 126 base::ListValue image_urls; 127 for (int i = kFirstDefaultImageIndex; i < kDefaultImagesCount; ++i) { 128 scoped_ptr<base::DictionaryValue> image_data(new base::DictionaryValue); 129 image_data->SetString("url", GetDefaultImageUrl(i)); 130 image_data->SetString( 131 "author", l10n_util::GetStringUTF16(kDefaultImageAuthorIDs[i])); 132 image_data->SetString( 133 "website", l10n_util::GetStringUTF16(kDefaultImageWebsiteIDs[i])); 134 image_data->SetString("title", GetDefaultImageDescription(i)); 135 image_urls.Append(image_data.release()); 136 } 137 CallJS("setDefaultImages", image_urls); 138 if (!screen_) 139 return; 140 if (screen_->selected_image() != User::kInvalidImageIndex) 141 SelectImage(screen_->selected_image()); 142 143 if (screen_->profile_picture_data_url() != content::kAboutBlankURL) 144 SendProfileImage(screen_->profile_picture_data_url()); 145 else if (screen_->profile_picture_absent()) 146 OnProfileImageAbsent(); 147 } 148 149 void UserImageScreenHandler::HandlePhotoTaken(const std::string& image_url) { 150 std::string mime_type, charset, raw_data; 151 if (!net::DataURL::Parse(GURL(image_url), &mime_type, &charset, &raw_data)) 152 NOTREACHED(); 153 DCHECK_EQ("image/png", mime_type); 154 155 if (screen_) 156 screen_->OnPhotoTaken(raw_data); 157 } 158 159 void UserImageScreenHandler::HandleCheckCameraPresence() { 160 if (!screen_) 161 return; 162 screen_->CheckCameraPresence(); 163 } 164 165 void UserImageScreenHandler::HandleSelectImage(const std::string& image_url, 166 const std::string& image_type) { 167 if (screen_) 168 screen_->OnImageSelected(image_type, image_url); 169 } 170 171 void UserImageScreenHandler::HandleImageAccepted() { 172 if (screen_) 173 screen_->OnImageAccepted(); 174 } 175 176 void UserImageScreenHandler::HandleScreenShown() { 177 DCHECK(!screen_show_time_.is_null()); 178 179 base::TimeDelta delta = base::Time::Now() - screen_show_time_; 180 VLOG(1) << "Screen load time: " << delta.InSecondsF(); 181 UMA_HISTOGRAM_TIMES("UserImage.ScreenIsShownTime", delta); 182 } 183 184 void UserImageScreenHandler::SetCameraPresent(bool present) { 185 CallJS("setCameraPresent", present); 186 } 187 188 void UserImageScreenHandler::SetProfilePictureEnabled(bool enabled) { 189 CallJS("setProfilePictureEnabled", enabled); 190 } 191 192 } // namespace chromeos 193