From 319eae62b1467d07b648b7f71147500a5ca207bf Mon Sep 17 00:00:00 2001 From: "antrim@chromium.org" Date: Tue, 25 Jun 2013 00:29:59 +0000 Subject: [PATCH] Copy image selection screen for supervised users BUG=251178 R=nkostylev@chromium.org please use lgtm&cq if appropriate Review URL: https://chromiumcodereview.appspot.com/17029017 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@208316 0039d316-1c4b-4281-b951-d872f2087c98 --- .../locally_managed_user_creation_screen.cc | 117 ++++++++++++-- .../managed/locally_managed_user_creation_screen.h | 28 +++- .../login/screen_locally_managed_user_creation.css | 177 +++++++++++++++++++++ .../screen_locally_managed_user_creation.html | 41 ++++- .../login/screen_locally_managed_user_creation.js | 152 +++++++++++++++++- ...locally_managed_user_creation_screen_handler.cc | 73 ++++++++- .../locally_managed_user_creation_screen_handler.h | 18 ++- 7 files changed, 576 insertions(+), 30 deletions(-) diff --git a/chrome/browser/chromeos/login/managed/locally_managed_user_creation_screen.cc b/chrome/browser/chromeos/login/managed/locally_managed_user_creation_screen.cc index cb83007f0f89..78fe1b14d6a2 100644 --- a/chrome/browser/chromeos/login/managed/locally_managed_user_creation_screen.cc +++ b/chrome/browser/chromeos/login/managed/locally_managed_user_creation_screen.cc @@ -5,14 +5,20 @@ #include "chrome/browser/chromeos/login/managed/locally_managed_user_creation_screen.h" #include "base/values.h" +#include "chrome/browser/chromeos/camera_detector.h" #include "chrome/browser/chromeos/login/existing_user_controller.h" #include "chrome/browser/chromeos/login/managed/locally_managed_user_creation_controller.h" #include "chrome/browser/chromeos/login/screens/error_screen.h" #include "chrome/browser/chromeos/login/screens/screen_observer.h" +#include "chrome/browser/chromeos/login/user_image.h" +#include "chrome/browser/chromeos/login/user_image_manager.h" #include "chrome/browser/chromeos/login/wizard_controller.h" #include "chromeos/network/network_state.h" +#include "content/public/browser/browser_thread.h" #include "grit/generated_resources.h" +#include "third_party/skia/include/core/SkBitmap.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/gfx/image/image_skia.h" namespace chromeos { @@ -51,9 +57,13 @@ LocallyManagedUserCreationScreen::LocallyManagedUserCreationScreen( ScreenObserver* observer, LocallyManagedUserCreationScreenHandler* actor) : WizardScreen(observer), + weak_factory_(this), actor_(actor), on_error_screen_(false), - on_image_screen_(false) { + on_image_screen_(false), + image_decoder_(NULL), + apply_photo_after_decoding_(false), + selected_image_(0) { DCHECK(actor_); if (actor_) actor_->SetDelegate(this); @@ -62,6 +72,8 @@ LocallyManagedUserCreationScreen::LocallyManagedUserCreationScreen( LocallyManagedUserCreationScreen::~LocallyManagedUserCreationScreen() { if (actor_) actor_->SetDelegate(NULL); + if (image_decoder_.get()) + image_decoder_->set_delegate(NULL); } void LocallyManagedUserCreationScreen::PrepareToShow() { @@ -221,27 +233,104 @@ void LocallyManagedUserCreationScreen::OnCreationError( actor_->ShowErrorPage(title, message, button); } -void LocallyManagedUserCreationScreen::SelectPicture() { - on_image_screen_ = true; - WizardController::default_controller()-> - EnableUserImageScreenReturnToPreviousHack(); - DictionaryValue* params = new DictionaryValue(); - params->SetBoolean("profile_picture_enabled", false); - params->SetString("user_id", controller_->GetManagedUserId()); +void LocallyManagedUserCreationScreen::OnCreationTimeout() { + if (actor_) { + actor_->ShowStatusMessage(false /* error */, l10n_util::GetStringUTF16( + IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_CREATION_TIMEOUT_MESSAGE)); + } +} - WizardController::default_controller()-> - AdvanceToScreenWithParams(WizardController::kUserImageScreenName, params); +// TODO(antrim) : this is an explicit code duplications with UserImageScreen. +// It should be removed by issue 251179. + +void LocallyManagedUserCreationScreen::ApplyPicture() { + UserManager* user_manager = UserManager::Get(); + UserImageManager* image_manager = user_manager->GetUserImageManager(); + std::string user_id = controller_->GetManagedUserId(); + switch (selected_image_) { + case User::kExternalImageIndex: + // Photo decoding may not have been finished yet. + if (user_photo_.isNull()) { + apply_photo_after_decoding_ = true; + return; + } + image_manager-> + SaveUserImage(user_id, UserImage::CreateAndEncode(user_photo_)); + break; + case User::kProfileImageIndex: + NOTREACHED() << "Supervised users have no profile pictures"; + break; + default: + DCHECK(selected_image_ >= 0 && selected_image_ < kDefaultImagesCount); + image_manager->SaveUserDefaultImageIndex(user_id, selected_image_); + break; + } + // Proceed to tutorial. + actor_->ShowTutorialPage(); } void LocallyManagedUserCreationScreen::OnCreationSuccess() { - SelectPicture(); + ApplyPicture(); } -void LocallyManagedUserCreationScreen::OnCreationTimeout() { +void LocallyManagedUserCreationScreen::CheckCameraPresence() { + CameraDetector::StartPresenceCheck( + base::Bind(&LocallyManagedUserCreationScreen::OnCameraPresenceCheckDone, + weak_factory_.GetWeakPtr())); +} + +void LocallyManagedUserCreationScreen::OnCameraPresenceCheckDone() { if (actor_) { - actor_->ShowStatusMessage(false /* error */, l10n_util::GetStringUTF16( - IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_CREATION_TIMEOUT_MESSAGE)); + actor_->SetCameraPresent( + CameraDetector::camera_presence() == CameraDetector::kCameraPresent); + } +} + +void LocallyManagedUserCreationScreen::OnPhotoTaken( + const std::string& raw_data) { + DCHECK(content::BrowserThread::CurrentlyOn(content::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 task_runner = + content::BrowserThread::GetMessageLoopProxyForThread( + content::BrowserThread::UI); + image_decoder_->Start(task_runner); +} + +void LocallyManagedUserCreationScreen::OnImageDecoded( + const ImageDecoder* decoder, + const SkBitmap& decoded_image) { + DCHECK_EQ(image_decoder_.get(), decoder); + user_photo_ = gfx::ImageSkia::CreateFrom1xBitmap(decoded_image); + if (apply_photo_after_decoding_) + ApplyPicture(); +} + +void LocallyManagedUserCreationScreen::OnDecodeImageFailed( + const ImageDecoder* decoder) { + NOTREACHED() << "Failed to decode PNG image from WebUI"; +} + +void LocallyManagedUserCreationScreen::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 { + NOTREACHED() << "Unexpected image type: " << image_type; } } +void LocallyManagedUserCreationScreen::OnImageAccepted() { +} + } // namespace chromeos diff --git a/chrome/browser/chromeos/login/managed/locally_managed_user_creation_screen.h b/chrome/browser/chromeos/login/managed/locally_managed_user_creation_screen.h index efef78817edd..f5b338d6a564 100644 --- a/chrome/browser/chromeos/login/managed/locally_managed_user_creation_screen.h +++ b/chrome/browser/chromeos/login/managed/locally_managed_user_creation_screen.h @@ -12,7 +12,9 @@ #include "chrome/browser/chromeos/login/managed/locally_managed_user_creation_controller.h" #include "chrome/browser/chromeos/login/screens/wizard_screen.h" #include "chrome/browser/chromeos/net/network_portal_detector.h" +#include "chrome/browser/image_decoder.h" #include "chrome/browser/ui/webui/chromeos/login/locally_managed_user_creation_screen_handler.h" +#include "ui/gfx/image/image_skia.h" class Profile; @@ -25,6 +27,7 @@ class LocallyManagedUserCreationScreen : public WizardScreen, public LocallyManagedUserCreationScreenHandler::Delegate, public LocallyManagedUserCreationController::StatusConsumer, + public ImageDecoder::Delegate, public NetworkPortalDetector::Observer { public: LocallyManagedUserCreationScreen( @@ -73,7 +76,6 @@ class LocallyManagedUserCreationScreen const std::string& manager_password) OVERRIDE; virtual void AbortFlow() OVERRIDE; virtual void FinishFlow() OVERRIDE; - virtual void SelectPicture() OVERRIDE; // LocallyManagedUserController::StatusConsumer overrides. virtual void OnCreationError( @@ -85,7 +87,26 @@ class LocallyManagedUserCreationScreen virtual void OnPortalDetectionCompleted( const NetworkState* network, const NetworkPortalDetector::CaptivePortalState& state) OVERRIDE; + + // TODO(antrim) : this is an explicit code duplications with UserImageScreen. + // It should be removed by issue 251179. + + // LocallyManagedUserCreationScreenHandler::Delegate (image) implementation: + virtual void CheckCameraPresence() OVERRIDE; + virtual void OnPhotoTaken(const std::string& raw_data) OVERRIDE; + virtual void OnImageSelected(const std::string& image_url, + const std::string& image_type) OVERRIDE; + virtual void OnImageAccepted() OVERRIDE; + // ImageDecoder::Delegate overrides: + virtual void OnImageDecoded(const ImageDecoder* decoder, + const SkBitmap& decoded_image) OVERRIDE; + virtual void OnDecodeImageFailed(const ImageDecoder* decoder) OVERRIDE; + private: + void ApplyPicture(); + void OnCameraPresenceCheckDone(); + + base::WeakPtrFactory weak_factory_; LocallyManagedUserCreationScreenHandler* actor_; scoped_ptr controller_; @@ -93,6 +114,11 @@ class LocallyManagedUserCreationScreen bool on_error_screen_; bool on_image_screen_; + gfx::ImageSkia user_photo_; + scoped_refptr image_decoder_; + bool apply_photo_after_decoding_; + int selected_image_; + DISALLOW_COPY_AND_ASSIGN(LocallyManagedUserCreationScreen); }; diff --git a/chrome/browser/resources/chromeos/login/screen_locally_managed_user_creation.css b/chrome/browser/resources/chromeos/login/screen_locally_managed_user_creation.css index 325a734d596b..5e64473dd3a4 100644 --- a/chrome/browser/resources/chromeos/login/screen_locally_managed_user_creation.css +++ b/chrome/browser/resources/chromeos/login/screen_locally_managed_user_creation.css @@ -221,3 +221,180 @@ #managed-user-creation .password-error { border: 1px solid red !important; } + +#managed-user-creation-image-picker { + margin-top: 16px; +} + +#managed-user-creation-image-grid { + -webkit-user-drag: none; + -webkit-user-select: none; + display: inline-block; + height: 264px; + margin: 0; + outline: none; + overflow: hidden; + padding: 0; + width: 400px; +} + +#managed-user-creation-image-grid img { + background-color: white; + height: 50px; + vertical-align: middle; + width: 50px; +} + +#managed-user-creation-image-grid > li { + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + display: inline-block; + margin: 4px; + padding: 3px; +} + +#managed-user-creation-image-grid [selected] { + border: 2px solid rgb(0, 102, 204); + padding: 2px; +} + +#managed-user-creation-image-preview { + float: right; + margin: 4px; + max-width: 220px; + position: relative; +} + +html[dir=rtl] #managed-user-creation-image-preview { + float: left; +} + +#managed-user-creation-image-preview-img { + -webkit-transition: -webkit-transform 200ms linear; + display: block; + max-height: 220px; + max-width: 220px; +} + +.camera.live #managed-user-creation-image-preview-img { + display: none; +} + +.camera.flip-x #managed-user-creation-image-preview-img { + -webkit-transform: rotateY(180deg); +} + +.default-image #managed-user-creation-image-preview-img { + background: white; + border: solid 1px #cacaca; + border-radius: 4px; + padding: 2px; +} + +.managed-user-creation-image-stream-area { + display: none; + padding: 0; + position: relative; +} + +.camera.live .managed-user-creation-image-stream-area { + display: block; +} + +#managed-user-creation-image-stream-crop { + -webkit-transition: -webkit-transform 200ms linear; + height: 220px; + overflow: hidden; + position: relative; + width: 220px; +} + +.flip-x #managed-user-creation-image-stream-crop { + -webkit-transform: rotateY(180deg); +} + +.managed-user-creation-image-stream { + border: solid 1px #cacaca; + height: 220px; + /* Center image for 4:3 aspect ratio. */ + left: -16.6%; + position: absolute; + visibility: hidden; +} + +.online .managed-user-creation-image-stream { + visibility: visible; +} + +#managed-user-creation-image-preview-caption { + color: dimGray; + font-size: smaller; + margin: 8px 4px; +} + +.camera #managed-user-creation-image-preview-caption { + display: none; +} + +#managed-user-creation-flip-photo { + -webkit-transition: opacity 75ms linear; + background: url('chrome://theme/IDR_MIRROR_FLIP') no-repeat; + border: none; + bottom: 44px; /* 8px + image bottom. */ + display: block; + height: 32px; + opacity: 0; + position: absolute; + right: 8px; + width: 32px; +} + +html[dir=rtl] #managed-user-creation-flip-photo { + left: 8px; + right: auto; +} + +/* "Flip photo" button is hidden during flip animation. */ +.camera.online:not(.animation) #managed-user-creation-flip-photo { + opacity: 0.75; +} + +#managed-user-creation-discard-photo, +#managed-user-creation-take-photo { + display: none; + height: 25px; + margin: 4px 1px; + padding: 0; + width: 220px; +} + +.camera:not(.live) #managed-user-creation-discard-photo { + background: url('chrome://theme/IDR_USER_IMAGE_RECYCLE') + no-repeat center 0; + display: block; +} + +.camera.live.online #managed-user-creation-take-photo { + background: url('chrome://theme/IDR_USER_IMAGE_CAPTURE') + no-repeat center -1px; + display: block; +} + +#managed-user-creation-image-preview .perspective-box { + -webkit-perspective: 600px; +} + +.managed-user-creation-image-stream-area .spinner { + display: none; + height: 44px; + left: 50%; + margin-left: -22px; + margin-top: -22px; + position: absolute; + top: 50%; + width: 44px; +} + +.camera.live:not(.online) .managed-user-creation-image-stream-area .spinner { + display: block; +} diff --git a/chrome/browser/resources/chromeos/login/screen_locally_managed_user_creation.html b/chrome/browser/resources/chromeos/login/screen_locally_managed_user_creation.html index 2c87f308c3ad..96e367d2a589 100644 --- a/chrome/browser/resources/chromeos/login/screen_locally_managed_user_creation.html +++ b/chrome/browser/resources/chromeos/login/screen_locally_managed_user_creation.html @@ -48,16 +48,41 @@
-
-
- +
+
+ +
+
+ +
-
- +
+
+ + +
+ +
+
+
+ +
+
+
+

+ + +
diff --git a/chrome/browser/resources/chromeos/login/screen_locally_managed_user_creation.js b/chrome/browser/resources/chromeos/login/screen_locally_managed_user_creation.js index 7c48c51a93b9..f5ed26146795 100644 --- a/chrome/browser/resources/chromeos/login/screen_locally_managed_user_creation.js +++ b/chrome/browser/resources/chromeos/login/screen_locally_managed_user_creation.js @@ -8,6 +8,8 @@ login.createScreen('LocallyManagedUserCreationScreen', 'managed-user-creation', function() { + var UserImagesGrid = options.UserImagesGrid; + var ManagerPod = cr.ui.define(function() { var node = $('managed-user-creation-manager-template').cloneNode(true); node.removeAttribute('id'); @@ -207,6 +209,8 @@ login.createScreen('LocallyManagedUserCreationScreen', 'showStatusError', 'showTutorialPage', 'showUsernamePage', + 'setDefaultImages', + 'setCameraPresent', ], lastVerifiedName_: null, @@ -242,7 +246,6 @@ login.createScreen('LocallyManagedUserCreationScreen', passwordField.focus(); }, this.clearUserNameError_.bind(this)); - this.configureTextInput(passwordField, this.updateNextButtonForUser_.bind(this), this.validIfNotEmpty_.bind(this), @@ -262,6 +265,53 @@ login.createScreen('LocallyManagedUserCreationScreen', creationScreen.handleErrorButtonPressed_(); e.stopPropagation(); }); + + /* + TODO(antrim) : this is an explicit code duplications with UserImageScreen. + It should be removed by issue 251179. + */ + var imageGrid = this.getScreenElement('image-grid'); + UserImagesGrid.decorate(imageGrid); + + // Preview image will track the selected item's URL. + var previewElement = this.getScreenElement('image-preview'); + previewElement.oncontextmenu = function(e) { e.preventDefault(); }; + + imageGrid.previewElement = previewElement; + imageGrid.selectionType = 'default'; + + imageGrid.addEventListener('select', + this.handleSelect_.bind(this)); + imageGrid.addEventListener('phototaken', + this.handlePhotoTaken_.bind(this)); + imageGrid.addEventListener('photoupdated', + this.handlePhotoUpdated_.bind(this)); + + // Set the title for camera item in the grid. + imageGrid.setCameraTitles( + loadTimeData.getString('takePhoto'), + loadTimeData.getString('photoFromCamera')); + + this.getScreenElement('take-photo').addEventListener( + 'click', this.handleTakePhoto_.bind(this)); + this.getScreenElement('discard-photo').addEventListener( + 'click', this.handleDiscardPhoto_.bind(this)); + + // Toggle 'animation' class for the duration of WebKit transition. + this.getScreenElement('flip-photo').addEventListener( + 'click', function(e) { + previewElement.classList.add('animation'); + imageGrid.flipPhoto = !imageGrid.flipPhoto; + }); + this.getScreenElement('image-stream-crop').addEventListener( + 'webkitTransitionEnd', function(e) { + previewElement.classList.remove('animation'); + }); + this.getScreenElement('image-preview-img').addEventListener( + 'webkitTransitionEnd', function(e) { + previewElement.classList.remove('animation'); + }); + chrome.send('supervisedUserGetImages'); }, buttonIds: [], @@ -546,7 +596,7 @@ login.createScreen('LocallyManagedUserCreationScreen', 24, 4); $('managed-user-creation-password').classList.add('password-error'); $('managed-user-creation-password').focus(); - + this.disabled = false; this.setButtonDisabledStatus('next', true); }, @@ -645,6 +695,17 @@ login.createScreen('LocallyManagedUserCreationScreen', this.getScreenButton(pageButtons[visiblePage]).focus(); this.currentPage_ = visiblePage; + + if (visiblePage == 'username') { + var imageGrid = this.getScreenElement('image-grid'); + // select some image. + var selected = this.imagesData_[ + Math.floor(Math.random() * this.imagesData_.length)]; + imageGrid.selectedItemUrl = selected.url; + chrome.send('supervisedUserSelectImage', + [selected.url, 'default']); + this.getScreenElement('image-grid').redraw(); + } }, setButtonDisabledStatus: function(buttonName, status) { @@ -710,6 +771,8 @@ login.createScreen('LocallyManagedUserCreationScreen', if (data['managers']) { this.loadManagers(data['managers']); } + var imageGrid = this.getScreenElement('image-grid'); + imageGrid.updateAndFocus(); }, /** @@ -717,6 +780,7 @@ login.createScreen('LocallyManagedUserCreationScreen', */ onBeforeHide: function() { $('login-header-bar').signinUIState = SIGNIN_UI_STATE.HIDDEN; + this.getScreenElement('image-grid').stopCamera(); }, /** @@ -841,7 +905,89 @@ login.createScreen('LocallyManagedUserCreationScreen', showManagerPasswordError: function() { this.disabled = false; this.showSelectedManagerPasswordError_(); - } + }, + + /* + TODO(antrim) : this is an explicit code duplications with UserImageScreen. + It should be removed by issue 251179. + */ + /** + * Currently selected user image index (take photo button is with zero + * index). + * @type {number} + */ + selectedUserImage_: -1, + imagesData: [], + + setDefaultImages: function(imagesData) { + var imageGrid = this.getScreenElement('image-grid'); + for (var i = 0, data; data = imagesData[i]; i++) { + var item = imageGrid.addItem(data.url, data.title); + item.type = 'default'; + item.author = data.author || ''; + item.website = data.website || ''; + } + this.imagesData_ = imagesData; + }, + + /** + * Handles selection change. + * @param {cr.Event} e Selection change event. + * @private + */ + handleSelect_: function(e) { + var imageGrid = this.getScreenElement('image-grid'); + if (!(imageGrid.selectionType == 'camera' && imageGrid.cameraLive)) { + chrome.send('supervisedUserSelectImage', + [imageGrid.selectedItemUrl, imageGrid.selectionType]); + } + // Start/stop camera on (de)selection. + if (!imageGrid.inProgramSelection && + imageGrid.selectionType != e.oldSelectionType) { + if (imageGrid.selectionType == 'camera') { + // Programmatic selection of camera item is done in + // startCamera callback where streaming is started by itself. + imageGrid.startCamera( + function() { + // Start capture if camera is still the selected item. + return imageGrid.selectedItem == imageGrid.cameraImage; + }); + } else { + imageGrid.stopCamera(); + } + } + }, + + /** + * Handle photo capture from the live camera stream. + */ + handleTakePhoto_: function(e) { + this.getScreenElement('image-grid').takePhoto(); + }, + + handlePhotoTaken_: function(e) { + chrome.send('supervisedUserPhotoTaken', [e.dataURL]); + }, + + /** + * Handle photo updated event. + * @param {cr.Event} e Event with 'dataURL' property containing a data URL. + */ + handlePhotoUpdated_: function(e) { + chrome.send('supervisedUserPhotoTaken', [e.dataURL]); + }, + + /** + * Handle discarding the captured photo. + */ + handleDiscardPhoto_: function(e) { + var imageGrid = this.getScreenElement('image-grid'); + imageGrid.discardPhoto(); + }, + + setCameraPresent: function(present) { + this.getScreenElement('image-grid').cameraPresent = present; + }, }; }); diff --git a/chrome/browser/ui/webui/chromeos/login/locally_managed_user_creation_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/locally_managed_user_creation_screen_handler.cc index 48d2d25d2dab..6e1bed3851d7 100644 --- a/chrome/browser/ui/webui/chromeos/login/locally_managed_user_creation_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/locally_managed_user_creation_screen_handler.cc @@ -15,6 +15,7 @@ #include "chrome/common/url_constants.h" #include "google_apis/gaia/gaia_auth_util.h" #include "grit/generated_resources.h" +#include "net/base/data_url.h" #include "ui/base/l10n/l10n_util.h" namespace { @@ -28,7 +29,8 @@ const char kLocallyManagedUserCreationScreen[] = namespace chromeos { LocallyManagedUserCreationScreenHandler:: - LocallyManagedUserCreationScreenHandler() {} + LocallyManagedUserCreationScreenHandler() : delegate_(NULL) { +} LocallyManagedUserCreationScreenHandler:: ~LocallyManagedUserCreationScreenHandler() {} @@ -102,6 +104,12 @@ void LocallyManagedUserCreationScreenHandler::DeclareLocalizedValues( IDS_CREATE_LOCALLY_MANAGED_USER_CREATED_1_TEXT_3); builder->Add("managementURL", chrome::kSupervisedUserManagementDisplayURL); + + // TODO(antrim) : this is an explicit code duplications with UserImageScreen. + // It should be removed by issue 251179. + builder->Add("takePhoto", IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO); + builder->Add("discardPhoto", IDS_OPTIONS_CHANGE_PICTURE_DISCARD_PHOTO); + builder->Add("flipPhoto", IDS_OPTIONS_CHANGE_PICTURE_FLIP_PHOTO); } void LocallyManagedUserCreationScreenHandler::Initialize() {} @@ -125,6 +133,20 @@ void LocallyManagedUserCreationScreenHandler::RegisterMessages() { AddCallback("managerSelectedOnLocallyManagedUserCreationFlow", &LocallyManagedUserCreationScreenHandler:: HandleManagerSelected); + + // TODO(antrim) : this is an explicit code duplications with UserImageScreen. + // It should be removed by issue 251179. + AddCallback("supervisedUserGetImages", + &LocallyManagedUserCreationScreenHandler:: + HandleGetImages); + + AddCallback("supervisedUserPhotoTaken", + &LocallyManagedUserCreationScreenHandler::HandlePhotoTaken); + AddCallback("supervisedUserSelectImage", + &LocallyManagedUserCreationScreenHandler::HandleSelectImage); + AddCallback("supervisedUserCheckCameraPresence", + &LocallyManagedUserCreationScreenHandler:: + HandleCheckCameraPresence); } void LocallyManagedUserCreationScreenHandler::PrepareToShow() {} @@ -146,6 +168,10 @@ void LocallyManagedUserCreationScreenHandler::Show() { } data->Set("managers", users_list.release()); ShowScreen(OobeUI::kScreenManagedUserCreationFlow, data.get()); + + if (!delegate_) + return; + delegate_->CheckCameraPresence(); } void LocallyManagedUserCreationScreenHandler::Hide() {} @@ -256,4 +282,49 @@ void LocallyManagedUserCreationScreenHandler::HandleAuthenticateManager( delegate_->AuthenticateManager(manager_username, manager_password); } +// TODO(antrim) : this is an explicit code duplications with UserImageScreen. +// It should be removed by issue 251179. +void LocallyManagedUserCreationScreenHandler::HandleGetImages() { + base::ListValue image_urls; + for (int i = kFirstDefaultImageIndex; i < kDefaultImagesCount; ++i) { + scoped_ptr image_data(new base::DictionaryValue); + image_data->SetString("url", GetDefaultImageUrl(i)); + image_data->SetString( + "author", l10n_util::GetStringUTF16(kDefaultImageAuthorIDs[i])); + image_data->SetString( + "website", l10n_util::GetStringUTF16(kDefaultImageWebsiteIDs[i])); + image_data->SetString("title", GetDefaultImageDescription(i)); + image_urls.Append(image_data.release()); + } + CallJS("login.LocallyManagedUserCreationScreen.setDefaultImages", image_urls); +} + +void LocallyManagedUserCreationScreenHandler::HandlePhotoTaken + (const std::string& image_url) { + std::string mime_type, charset, raw_data; + if (!net::DataURL::Parse(GURL(image_url), &mime_type, &charset, &raw_data)) + NOTREACHED(); + DCHECK_EQ("image/png", mime_type); + + if (delegate_) + delegate_->OnPhotoTaken(raw_data); +} + +void LocallyManagedUserCreationScreenHandler::HandleCheckCameraPresence() { + if (!delegate_) + return; + delegate_->CheckCameraPresence(); +} + +void LocallyManagedUserCreationScreenHandler::HandleSelectImage( + const std::string& image_url, + const std::string& image_type) { + if (delegate_) + delegate_->OnImageSelected(image_type, image_url); +} + +void LocallyManagedUserCreationScreenHandler::SetCameraPresent(bool present) { + CallJS("login.LocallyManagedUserCreationScreen.setCameraPresent", present); +} + } // namespace chromeos diff --git a/chrome/browser/ui/webui/chromeos/login/locally_managed_user_creation_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/locally_managed_user_creation_screen_handler.h index d88faa39a5e7..1ec027a4b197 100644 --- a/chrome/browser/ui/webui/chromeos/login/locally_managed_user_creation_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/locally_managed_user_creation_screen_handler.h @@ -9,6 +9,7 @@ #include "base/compiler_specific.h" #include "base/strings/string16.h" +#include "chrome/browser/chromeos/login/default_user_images.h" #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" #include "content/public/browser/web_ui.h" @@ -44,11 +45,14 @@ class LocallyManagedUserCreationScreenHandler : public BaseScreenHandler { const string16& display_name, const std::string& managed_user_password) = 0; - // Starts picture selection for created managed user. - virtual void SelectPicture() = 0; - virtual void AbortFlow() = 0; virtual void FinishFlow() = 0; + + virtual void CheckCameraPresence() = 0; + virtual void OnPhotoTaken(const std::string& raw_data) = 0; + virtual void OnImageSelected(const std::string& image_url, + const std::string& image_type) = 0; + virtual void OnImageAccepted() = 0; }; LocallyManagedUserCreationScreenHandler(); @@ -74,6 +78,8 @@ class LocallyManagedUserCreationScreenHandler : public BaseScreenHandler { const string16& message, const string16& button_text); + void SetCameraPresent(bool enabled); + // BaseScreenHandler implementation: virtual void DeclareLocalizedValues(LocalizedValuesBuilder* builder) OVERRIDE; virtual void Initialize() OVERRIDE; @@ -96,6 +102,12 @@ class LocallyManagedUserCreationScreenHandler : public BaseScreenHandler { void HandleCreateManagedUser(const string16& new_raw_user_name, const std::string& new_user_password); + void HandleGetImages(); + void HandlePhotoTaken(const std::string& image_url); + void HandleCheckCameraPresence(); + void HandleSelectImage(const std::string& image_url, + const std::string& image_type); + void UpdateText(const std::string& element_id, const string16& text); Delegate* delegate_; -- 2.11.4.GIT