Index: chrome/browser/resources/options2/chromeos/change_picture_options.js |
diff --git a/chrome/browser/resources/options2/chromeos/change_picture_options.js b/chrome/browser/resources/options2/chromeos/change_picture_options.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b9867431f17e1887125884a281800a94ab70eb87 |
--- /dev/null |
+++ b/chrome/browser/resources/options2/chromeos/change_picture_options.js |
@@ -0,0 +1,267 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+cr.define('options', function() { |
+ |
+ var OptionsPage = options.OptionsPage; |
+ var UserImagesGrid = options.UserImagesGrid; |
+ var ButtonImages = UserImagesGrid.ButtonImages; |
+ |
+ /** |
+ * Array of button URLs used on this page. |
+ * @type {Array.<string>} |
+ */ |
+ const ButtonImageUrls = [ |
+ ButtonImages.TAKE_PHOTO, |
+ ButtonImages.CHOOSE_FILE |
+ ]; |
+ |
+ ///////////////////////////////////////////////////////////////////////////// |
+ // ChangePictureOptions class: |
+ |
+ /** |
+ * Encapsulated handling of ChromeOS change picture options page. |
+ * @constructor |
+ */ |
+ function ChangePictureOptions() { |
+ OptionsPage.call( |
+ this, |
+ 'changePicture', |
+ localStrings.getString('changePicturePage'), |
+ 'change-picture-page'); |
+ } |
+ |
+ cr.addSingletonGetter(ChangePictureOptions); |
+ |
+ ChangePictureOptions.prototype = { |
+ // Inherit ChangePictureOptions from OptionsPage. |
+ __proto__: options.OptionsPage.prototype, |
+ |
+ /** |
+ * Initializes ChangePictureOptions page. |
+ */ |
+ initializePage: function() { |
+ // Call base class implementation to start preferences initialization. |
+ OptionsPage.prototype.initializePage.call(this); |
+ |
+ var imageGrid = $('images-grid'); |
+ UserImagesGrid.decorate(imageGrid); |
+ |
+ imageGrid.addEventListener('change', |
+ this.handleImageSelected_.bind(this)); |
+ imageGrid.addEventListener('activate', |
+ this.handleImageActivated_.bind(this)); |
+ imageGrid.addEventListener('dblclick', |
+ this.handleImageDblClick_.bind(this)); |
+ |
+ // Add the "Choose file" button. |
+ imageGrid.addItem(ButtonImages.CHOOSE_FILE, |
+ localStrings.getString('chooseFile'), |
+ this.handleChooseFile_.bind(this)); |
+ |
+ // Profile image data. |
+ this.profileImage_ = imageGrid.addItem( |
+ ButtonImages.PROFILE_PICTURE, |
+ localStrings.getString('profilePhotoLoading')); |
+ |
+ // Old user image data (if present). |
+ this.oldImage_ = null; |
+ |
+ chrome.send('onChangePicturePageInitialized'); |
+ }, |
+ |
+ /** |
+ * Called right after the page has been shown to user. |
+ */ |
+ didShowPage: function() { |
+ $('images-grid').updateAndFocus(); |
+ chrome.send('onChangePicturePageShown'); |
+ }, |
+ |
+ /** |
+ * Called right before the page is hidden. |
+ */ |
+ willHidePage: function() { |
+ var imageGrid = $('images-grid'); |
+ imageGrid.blur(); // Make sure the image grid is not active. |
+ if (this.oldImage_) { |
+ imageGrid.removeItem(this.oldImage_); |
+ this.oldImage_ = null; |
+ } |
+ }, |
+ |
+ /** |
+ * Closes current page, returning back to Personal Stuff page. |
+ * @private |
+ */ |
+ closePage_: function() { |
+ OptionsPage.navigateToPage('personal'); |
+ }, |
+ |
+ /** |
+ * Handles "Take photo" button activation. |
+ * @private |
+ */ |
+ handleTakePhoto_: function() { |
+ chrome.send('takePhoto'); |
+ this.closePage_(); |
+ }, |
+ |
+ /** |
+ * Handles "Choose a file" button activation. |
+ * @private |
+ */ |
+ handleChooseFile_: function() { |
+ chrome.send('chooseFile'); |
+ this.closePage_(); |
+ }, |
+ |
+ /** |
+ * Handles image selection change. |
+ * @private |
+ */ |
+ handleImageSelected_: function() { |
+ var imageGrid = $('images-grid'); |
+ var url = imageGrid.selectedItemUrl; |
+ // Ignore deselection, selection change caused by program itself and |
+ // selection of one of the action buttons. |
+ if (url && |
+ !imageGrid.inProgramSelection && |
+ ButtonImageUrls.indexOf(url) == -1) { |
+ chrome.send('selectImage', [url]); |
+ } |
+ }, |
+ |
+ /** |
+ * Handles image activation (by pressing Enter). |
+ * @private |
+ */ |
+ handleImageActivated_: function() { |
+ switch ($('images-grid').selectedItemUrl) { |
+ case ButtonImages.TAKE_PHOTO: |
+ this.handleTakePhoto_(); |
+ break; |
+ case ButtonImages.CHOOSE_FILE: |
+ this.handleChooseFile_(); |
+ break; |
+ default: |
+ this.closePage_(); |
+ break; |
+ } |
+ }, |
+ |
+ /** |
+ * Handles double click on the image grid. |
+ * @param {Event} e Double click Event. |
+ */ |
+ handleImageDblClick_: function(e) { |
+ // Close page unless the click target is the grid itself or |
+ // any of the buttons. |
+ var url = e.target.src; |
+ if (url && ButtonImageUrls.indexOf(url) == -1) |
+ this.closePage_(); |
+ }, |
+ |
+ /** |
+ * URL of the current user image. |
+ * @type {string} |
+ */ |
+ get currentUserImageUrl() { |
+ return 'chrome://userimage/' + PersonalOptions.getLoggedInUsername() + |
+ '?id=' + (new Date()).getTime(); |
+ }, |
+ |
+ /** |
+ * Notifies about camera presence change. |
+ * @param {boolean} present Whether a camera is present or not. |
+ * @private |
+ */ |
+ setCameraPresent_: function(present) { |
+ var imageGrid = $('images-grid'); |
+ if (present && !this.takePhotoButton_) { |
+ this.takePhotoButton_ = imageGrid.addItem( |
+ ButtonImages.TAKE_PHOTO, |
+ localStrings.getString('takePhoto'), |
+ this.handleTakePhoto_.bind(this), |
+ 1); |
+ } else if (!present && this.takePhotoButton_) { |
+ imageGrid.removeItem(this.takePhotoButton_); |
+ this.takePhotoButton_ = null; |
+ } |
+ }, |
+ |
+ /** |
+ * Adds or updates old user image taken from file/camera (neither a profile |
+ * image nor a default one). |
+ * @private |
+ */ |
+ setOldImage_: function() { |
+ var imageGrid = $('images-grid'); |
+ var url = this.currentUserImageUrl; |
+ if (this.oldImage_) { |
+ this.oldImage_ = imageGrid.updateItem(this.oldImage_, url); |
+ } else { |
+ // Insert next to the profile image. |
+ var pos = imageGrid.indexOf(this.profileImage_) + 1; |
+ this.oldImage_ = imageGrid.addItem(url, undefined, undefined, pos); |
+ imageGrid.selectedItem = this.oldImage_; |
+ } |
+ }, |
+ |
+ /** |
+ * Updates user's profile image. |
+ * @param {string} imageUrl Profile image, encoded as data URL. |
+ * @param {boolean} select If true, profile image should be selected. |
+ * @private |
+ */ |
+ setProfileImage_: function(imageUrl, select) { |
+ var imageGrid = $('images-grid'); |
+ this.profileImage_ = imageGrid.updateItem( |
+ this.profileImage_, imageUrl, localStrings.getString('profilePhoto')); |
+ if (select) |
+ imageGrid.selectedItem = this.profileImage_; |
+ }, |
+ |
+ /** |
+ * Selects user image with the given URL. |
+ * @param {string} url URL of the image to select. |
+ * @private |
+ */ |
+ setSelectedImage_: function(url) { |
+ $('images-grid').selectedItemUrl = url; |
+ }, |
+ |
+ /** |
+ * Appends default images to the image grid. Should only be called once. |
+ * @param {Array.<string>} images An array of URLs to default images. |
+ * @private |
+ */ |
+ setDefaultImages_: function(images) { |
+ var imageGrid = $('images-grid'); |
+ for (var i = 0, url; url = images[i]; i++) { |
+ imageGrid.addItem(url); |
+ } |
+ }, |
+ }; |
+ |
+ // Forward public APIs to private implementations. |
+ [ |
+ 'setCameraPresent', |
+ 'setDefaultImages', |
+ 'setOldImage', |
+ 'setProfileImage', |
+ 'setSelectedImage', |
+ ].forEach(function(name) { |
+ ChangePictureOptions[name] = function(value1, value2) { |
+ ChangePictureOptions.getInstance()[name + '_'](value1, value2); |
+ }; |
+ }); |
+ |
+ // Export |
+ return { |
+ ChangePictureOptions: ChangePictureOptions |
+ }; |
+ |
+}); |
+ |