12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WallpaperManager constructor. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WallpaperManager objects encapsulate the functionality of the wallpaper 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * manager extension. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @constructor 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {HTMLElement} dialogDom The DOM node containing the prototypical 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * extension UI. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function WallpaperManager(dialogDom) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.dialogDom_ = dialogDom; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.document_ = dialogDom.ownerDocument; 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this.enableOnlineWallpaper_ = loadTimeData.valueExists('manifestBaseURL'); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.selectedCategory = null; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this.selectedItem_ = null; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.progressManager_ = new ProgressManager(); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.customWallpaperData_ = null; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.currentWallpaper_ = null; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.wallpaperRequest_ = null; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.wallpaperDirs_ = WallpaperDirectories.getInstance(); 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this.preManifestDomInit_(); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.fetchManifest_(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Anonymous 'namespace'. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(bshe): Get rid of anonymous namespace. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function() { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * URL of the learn more page for wallpaper picker. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** @const */ var LearnMoreURL = 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'https://support.google.com/chromeos/?p=wallpaper_fileerror&hl=' + 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigator.language; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Index of the All category. It is the first category in wallpaper picker. 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** @const */ var AllCategoryIndex = 0; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Index offset of categories parsed from manifest. The All category is added 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * before them. So the offset is 1. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** @const */ var OnlineCategoriesOffset = 1; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a translated string. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Wrapper function to make dealing with translated strings more concise. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Equivilant to localStrings.getString(id). 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} id The id of the string to return. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {string} The translated string. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function str(id) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return loadTimeData.getString(id); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Retruns the current selected layout. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return {string} The selected layout. 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function getSelectedLayout() { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var setWallpaperLayout = $('set-wallpaper-layout'); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return setWallpaperLayout.options[setWallpaperLayout.selectedIndex].value; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Loads translated strings. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WallpaperManager.initStrings = function(callback) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome.wallpaperPrivate.getStrings(function(strings) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadTimeData.data = strings; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (callback) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Requests wallpaper manifest file from server. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WallpaperManager.prototype.fetchManifest_ = function() { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var locale = navigator.language; 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!this.enableOnlineWallpaper_) { 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this.postManifestDomInit_(); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var urls = [ 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) str('manifestBaseURL') + locale + '.json', 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fallback url. Use 'en' locale by default. 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) str('manifestBaseURL') + 'en.json']; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var asyncFetchManifestFromUrls = function(urls, func, successCallback, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) failureCallback) { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var index = 0; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var loop = { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next: function() { 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (index < urls.length) { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) func(loop, urls[index]); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index++; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) failureCallback(); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) success: function(response) { 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) successCallback(response); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) failure: function() { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) failureCallback(); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loop.next(); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var fetchManifestAsync = function(loop, url) { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var xhr = new XMLHttpRequest(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try { 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) xhr.addEventListener('loadend', function(e) { 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (this.status == 200 && this.responseText != null) { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var manifest = JSON.parse(this.responseText); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loop.success(manifest); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } catch (e) { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loop.failure(); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loop.next(); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) xhr.open('GET', url, true); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xhr.send(null); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } catch (e) { 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loop.failure(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (navigator.onLine) { 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) asyncFetchManifestFromUrls(urls, fetchManifestAsync, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.onLoadManifestSuccess_.bind(this), 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.onLoadManifestFailed_.bind(this)); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If device is offline, fetches manifest from local storage. 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(bshe): Always loading the offline manifest first and replacing 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // with the online one when available. 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.onLoadManifestFailed_(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Shows error message in a centered dialog. 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @private 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {string} errroMessage The string to show in the error dialog. 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.showError_ = function(errorMessage) { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) document.querySelector('.error-message').textContent = errorMessage; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) $('error-container').hidden = false; 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Sets manifest loaded from server. Called after manifest is successfully 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * loaded. 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {object} manifest The parsed manifest file. 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.onLoadManifestSuccess_ = function(manifest) { 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.manifest_ = manifest; 176a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WallpaperUtil.saveToStorage(Constants.AccessManifestKey, manifest, false); 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this.postManifestDomInit_(); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets manifest to previously saved object if any and shows connection error. 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called after manifest failed to load. 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.onLoadManifestFailed_ = function() { 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var accessManifestKey = Constants.AccessManifestKey; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var self = this; 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Constants.WallpaperLocalStorage.get(accessManifestKey, function(items) { 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.manifest_ = items[accessManifestKey] ? items[accessManifestKey] : {}; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.showError_(str('connectionFailed')); 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self.postManifestDomInit_(); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) $('wallpaper-grid').classList.add('image-picker-offline'); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Toggle surprise me feature of wallpaper picker. It fires an storage 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * onChanged event. Event handler for that event is in event_page.js. 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @private 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.toggleSurpriseMe_ = function() { 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var checkbox = $('surprise-me').querySelector('#checkbox'); 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var shouldEnable = !checkbox.classList.contains('checked'); 201a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WallpaperUtil.saveToStorage(Constants.AccessSurpriseMeEnabledKey, 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shouldEnable, true, function() { 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (chrome.runtime.lastError == null) { 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (shouldEnable) { 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) checkbox.classList.add('checked'); 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) checkbox.classList.remove('checked'); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) $('categories-list').disabled = shouldEnable; 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) $('wallpaper-grid').disabled = shouldEnable; 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(bshe): show error message to user. 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) console.error('Failed to save surprise me option to chrome storage.'); 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * One-time initialization of various DOM nodes. Fetching manifest may take a 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * long time due to slow connection. Dom nodes that do not depend on manifest 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * should be initialized here to unblock from manifest fetching. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WallpaperManager.prototype.preManifestDomInit_ = function() { 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) $('window-close-button').addEventListener('click', function() { 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window.close(); 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }); 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this.document_.defaultView.addEventListener( 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'resize', this.onResize_.bind(this)); 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this.document_.defaultView.addEventListener( 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'keydown', this.onKeyDown_.bind(this)); 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) $('learn-more').href = LearnMoreURL; 232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) $('close-error').addEventListener('click', function() { 233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) $('error-container').hidden = true; 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }); 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) $('close-wallpaper-selection').addEventListener('click', function() { 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) $('wallpaper-selection-container').hidden = true; 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) $('set-wallpaper-layout').disabled = true; 238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }); 239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /** 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * One-time initialization of various DOM nodes. Dom nodes that do depend on 243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * manifest should be initialized here. 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */ 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WallpaperManager.prototype.postManifestDomInit_ = function() { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i18nTemplate.process(this.document_, loadTimeData); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.initCategoriesList_(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.initThumbnailsGrid_(); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.presetCategory_(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $('file-selector').addEventListener( 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'change', this.onFileSelectorChanged_.bind(this)); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $('set-wallpaper-layout').addEventListener( 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'change', this.onWallpaperLayoutChanged_.bind(this)); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (loadTimeData.valueExists('wallpaperAppName')) { 2576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) $('wallpaper-set-by-message').textContent = loadTimeData.getStringF( 2586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 'currentWallpaperSetByMessage', str('wallpaperAppName')); 2596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 2606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (this.enableOnlineWallpaper_) { 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var self = this; 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) $('surprise-me').hidden = false; 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) $('surprise-me').addEventListener('click', 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this.toggleSurpriseMe_.bind(this)); 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Constants.WallpaperSyncStorage.get(Constants.AccessSurpriseMeEnabledKey, 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function(items) { 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Surprise me has been moved from local to sync storage, prefer 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // values from sync, but if unset check local and update synced pref 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // if applicable. 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!items.hasOwnProperty(Constants.AccessSurpriseMeEnabledKey)) { 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Constants.WallpaperLocalStorage.get( 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Constants.AccessSurpriseMeEnabledKey, function(values) { 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (values.hasOwnProperty(Constants.AccessSurpriseMeEnabledKey)) { 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WallpaperUtil.saveToStorage(Constants.AccessSurpriseMeEnabledKey, 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) values[Constants.AccessSurpriseMeEnabledKey], true); 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (values[Constants.AccessSurpriseMeEnabledKey]) { 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) $('surprise-me').querySelector('#checkbox').classList.add( 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 'checked'); 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) $('categories-list').disabled = true; 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) $('wallpaper-grid').disabled = true; 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }); 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (items[Constants.AccessSurpriseMeEnabledKey]) { 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) $('surprise-me').querySelector('#checkbox').classList.add('checked'); 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) $('categories-list').disabled = true; 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) $('wallpaper-grid').disabled = true; 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) window.addEventListener('offline', function() { 2938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chrome.wallpaperPrivate.getOfflineWallpaperList(function(lists) { 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!self.downloadedListMap_) 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) self.downloadedListMap_ = {}; 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (var i = 0; i < lists.length; i++) { 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) self.downloadedListMap_[lists[i]] = true; 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var thumbnails = self.document_.querySelectorAll('.thumbnail'); 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (var i = 0; i < thumbnails.length; i++) { 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var thumbnail = thumbnails[i]; 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var url = self.wallpaperGrid_.dataModel.item(i).baseURL; 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var fileName = url.substring(url.lastIndexOf('/') + 1) + 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Constants.HighResolutionSuffix; 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (self.downloadedListMap_ && 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) self.downloadedListMap_.hasOwnProperty(encodeURI(fileName))) { 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) thumbnail.offline = true; 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }); 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) $('wallpaper-grid').classList.add('image-picker-offline'); 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }); 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) window.addEventListener('online', function() { 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) self.downloadedListMap_ = null; 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) $('wallpaper-grid').classList.remove('image-picker-offline'); 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }); 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.onResize_(); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.initContextMenuAndCommand_(); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * One-time initialization of context menu and command. 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.initContextMenuAndCommand_ = function() { 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.wallpaperContextMenu_ = $('wallpaper-context-menu'); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cr.ui.Menu.decorate(this.wallpaperContextMenu_); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cr.ui.contextMenuHandler.setContextMenu(this.wallpaperGrid_, 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.wallpaperContextMenu_); 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var commands = this.dialogDom_.querySelectorAll('command'); 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var i = 0; i < commands.length; i++) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cr.ui.Command.decorate(commands[i]); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var doc = this.document_; 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) doc.addEventListener('command', this.onCommand_.bind(this)); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) doc.addEventListener('canExecute', this.onCommandCanExecute_.bind(this)); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Handles a command being executed. 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Event} event A command event. 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.onCommand_ = function(event) { 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event.command.id == 'delete') { 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var wallpaperGrid = this.wallpaperGrid_; 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var selectedIndex = wallpaperGrid.selectionModel.selectedIndex; 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var item = wallpaperGrid.dataModel.item(selectedIndex); 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!item || item.source != Constants.WallpaperSourceEnum.Custom) 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.removeCustomWallpaper(item.baseURL); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpaperGrid.dataModel.splice(selectedIndex, 1); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calculate the number of remaining custom wallpapers. The add new button 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in data model needs to be excluded. 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var customWallpaperCount = wallpaperGrid.dataModel.length - 1; 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (customWallpaperCount == 0) { 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Active custom wallpaper is also copied in chronos data dir. It needs 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to be deleted. 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome.wallpaperPrivate.resetWallpaper(); 3606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) this.onWallpaperChanged_(null, null); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selectedIndex = Math.min(selectedIndex, customWallpaperCount - 1); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpaperGrid.selectionModel.selectedIndex = selectedIndex; 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.cancelBubble = true; 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Decides if a command can be executed on current target. 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Event} event A command event. 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.onCommandCanExecute_ = function(event) { 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (event.command.id) { 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'delete': 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var wallpaperGrid = this.wallpaperGrid_; 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var selectedIndex = wallpaperGrid.selectionModel.selectedIndex; 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var item = wallpaperGrid.dataModel.item(selectedIndex); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (selectedIndex != this.wallpaperGrid_.dataModel.length - 1 && 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) item && item.source == Constants.WallpaperSourceEnum.Custom) { 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.canExecute = true; 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.canExecute = false; 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Preset to the category which contains current wallpaper. 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.presetCategory_ = function() { 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.currentWallpaper_ = str('currentWallpaper'); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The currentWallpaper_ is either a url contains HightResolutionSuffix or a 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // custom wallpaper file name converted from an integer value represent 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // time (e.g., 13006377367586070). 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!this.enableOnlineWallpaper_ || (this.currentWallpaper_ && 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this.currentWallpaper_.indexOf(Constants.HighResolutionSuffix) == -1)) { 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Custom is the last one in the categories list. 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.categoriesList_.selectionModel.selectedIndex = 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.categoriesList_.dataModel.length - 1; 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var self = this; 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var presetCategoryInner_ = function() { 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Selects the first category in the categories list of current 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // wallpaper as the default selected category when showing wallpaper 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // picker UI. 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var presetCategory = AllCategoryIndex; 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (self.currentWallpaper_) { 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var key in self.manifest_.wallpaper_list) { 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var url = self.manifest_.wallpaper_list[key].base_url + 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Constants.HighResolutionSuffix; 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.indexOf(self.currentWallpaper_) != -1 && 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.manifest_.wallpaper_list[key].categories.length > 0) { 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) presetCategory = self.manifest_.wallpaper_list[key].categories[0] + 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnlineCategoriesOffset; 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.categoriesList_.selectionModel.selectedIndex = presetCategory; 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (navigator.onLine) { 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) presetCategoryInner_(); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If device is offline, gets the available offline wallpaper list first. 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wallpapers which are not in the list will display a grayscaled 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thumbnail. 4308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chrome.wallpaperPrivate.getOfflineWallpaperList(function(lists) { 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!self.downloadedListMap_) 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.downloadedListMap_ = {}; 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var i = 0; i < lists.length; i++) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.downloadedListMap_[lists[i]] = true; 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) presetCategoryInner_(); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Constructs the thumbnails grid. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WallpaperManager.prototype.initThumbnailsGrid_ = function() { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.wallpaperGrid_ = $('wallpaper-grid'); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wallpapers.WallpaperThumbnailsGrid.decorate(this.wallpaperGrid_); 446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) this.wallpaperGrid_.autoExpands = true; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this.wallpaperGrid_.addEventListener('change', this.onChange_.bind(this)); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.wallpaperGrid_.addEventListener('dblclick', this.onClose_.bind(this)); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Handles change event dispatched by wallpaper grid. 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WallpaperManager.prototype.onChange_ = function() { 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // splice may dispatch a change event because the position of selected 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // element changing. But the actual selected element may not change after 458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // splice. Check if the new selected element equals to the previous selected 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // element before continuing. Otherwise, wallpaper may reset to previous one 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // as described in http://crbug.com/229036. 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (this.selectedItem_ == this.wallpaperGrid_.selectedItem) 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this.selectedItem_ = this.wallpaperGrid_.selectedItem; 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this.onSelectedItemChanged_(); 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /** 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Closes window if no pending wallpaper request. 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WallpaperManager.prototype.onClose_ = function() { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.wallpaperRequest_) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.wallpaperRequest_.addEventListener('loadend', function() { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close window on wallpaper loading finished. 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.close(); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.close(); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 4826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * Moves the check mark to |activeItem| and hides the wallpaper set by third 4836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * party message if any. Called when wallpaper changed successfully. 4846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * @param {?Object} activeItem The active item in WallpaperThumbnailsGrid's 4856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * data model. 4866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * @param {?string} currentWallpaperURL The URL or filename of current 4876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * wallpaper. 4886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) */ 4896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) WallpaperManager.prototype.onWallpaperChanged_ = function( 4906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) activeItem, currentWallpaperURL) { 4916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) this.wallpaperGrid_.activeItem = activeItem; 4926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) this.currentWallpaper_ = currentWallpaperURL; 4936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Hides the wallpaper set by message. 4946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) $('wallpaper-set-by-message').textContent = ''; 4956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) }; 4966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 4976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) /** 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Sets wallpaper to the corresponding wallpaper of selected thumbnail. 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {{baseURL: string, layout: string, source: string, 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * availableOffline: boolean, opt_dynamicURL: string, 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * opt_author: string, opt_authorWebsite: string}} 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * selectedItem the selected item in WallpaperThumbnailsGrid's data 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * model. 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.setSelectedWallpaper_ = function(selectedItem) { 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var self = this; 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (selectedItem.source) { 508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case Constants.WallpaperSourceEnum.Custom: 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var errorHandler = this.onFileSystemError_.bind(this); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var success = function(dirEntry) { 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dirEntry.getFile(selectedItem.baseURL, {create: false}, 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function(fileEntry) { 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileEntry.file(function(file) { 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var reader = new FileReader(); 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reader.readAsArrayBuffer(file); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reader.addEventListener('error', errorHandler); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reader.addEventListener('load', function(e) { 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.setCustomWallpaper(e.target.result, 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selectedItem.layout, 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, selectedItem.baseURL, 5216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) self.onWallpaperChanged_.bind(self, 5226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) selectedItem, selectedItem.baseURL), 5236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) errorHandler); 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, errorHandler); 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, errorHandler); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.wallpaperDirs_.getDirectory(WallpaperDirNameEnum.ORIGINAL, 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) success, errorHandler); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case Constants.WallpaperSourceEnum.OEM: 5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Resets back to default wallpaper. 5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) chrome.wallpaperPrivate.resetWallpaper(); 5346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) this.onWallpaperChanged_(selectedItem, selectedItem.baseURL); 5351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WallpaperUtil.saveWallpaperInfo(wallpaperURL, selectedItem.layout, 5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) selectedItem.source); 5371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case Constants.WallpaperSourceEnum.Online: 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var wallpaperURL = selectedItem.baseURL + 540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Constants.HighResolutionSuffix; 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var selectedGridItem = this.wallpaperGrid_.getListItem(selectedItem); 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome.wallpaperPrivate.setWallpaperIfExists(wallpaperURL, 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selectedItem.layout, 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function(exists) { 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (exists) { 5476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) self.onWallpaperChanged_(selectedItem, wallpaperURL); 548a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WallpaperUtil.saveWallpaperInfo(wallpaperURL, selectedItem.layout, 549a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) selectedItem.source); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Falls back to request wallpaper from server. 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (self.wallpaperRequest_) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.wallpaperRequest_.abort(); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.wallpaperRequest_ = new XMLHttpRequest(); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.progressManager_.reset(self.wallpaperRequest_, selectedGridItem); 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var onSuccess = function(xhr) { 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var image = xhr.response; 562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome.wallpaperPrivate.setWallpaper(image, selectedItem.layout, 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallpaperURL, 5646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) function() { 5656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) self.progressManager_.hideProgressBar(selectedGridItem); 5666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 5676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (chrome.runtime.lastError != undefined && 5686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) chrome.runtime.lastError.message != 5696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) str('canceledWallpaper')) { 5706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) self.showError_(chrome.runtime.lastError.message); 5716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } else { 5726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) self.onWallpaperChanged_(selectedItem, wallpaperURL); 5736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 5746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) }); 575a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WallpaperUtil.saveWallpaperInfo(wallpaperURL, selectedItem.layout, 576a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) selectedItem.source); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.wallpaperRequest_ = null; 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var onFailure = function() { 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) self.progressManager_.hideProgressBar(selectedGridItem); 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.showError_(str('downloadFailed')); 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) self.wallpaperRequest_ = null; 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WallpaperUtil.fetchURL(wallpaperURL, 'arraybuffer', onSuccess, 585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) onFailure, self.wallpaperRequest_); 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) console.error('Unsupported wallpaper source.'); 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Removes the oldest custom wallpaper. If the oldest one is set as current 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * wallpaper, removes the second oldest one to free some space. This should 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * only be called when exceeding wallpaper quota. 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.removeOldestWallpaper_ = function() { 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Custom wallpapers should already sorted when put to the data model. The 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // last element is the add new button, need to exclude it as well. 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var oldestIndex = this.wallpaperGrid_.dataModel.length - 2; 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var item = this.wallpaperGrid_.dataModel.item(oldestIndex); 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!item || item.source != Constants.WallpaperSourceEnum.Custom) 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (item.baseURL == this.currentWallpaper_) 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item = this.wallpaperGrid_.dataModel.item(--oldestIndex); 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (item) { 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.removeCustomWallpaper(item.baseURL); 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.wallpaperGrid_.dataModel.splice(oldestIndex, 1); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Shows an error message to user and log the failed reason in console. 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.onFileSystemError_ = function(e) { 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var msg = ''; 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (e.code) { 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case FileError.QUOTA_EXCEEDED_ERR: 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg = 'QUOTA_EXCEEDED_ERR'; 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Instead of simply remove oldest wallpaper, we should consider a 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // better way to handle this situation. See crbug.com/180890. 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.removeOldestWallpaper_(); 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case FileError.NOT_FOUND_ERR: 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg = 'NOT_FOUND_ERR'; 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case FileError.SECURITY_ERR: 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg = 'SECURITY_ERR'; 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case FileError.INVALID_MODIFICATION_ERR: 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg = 'INVALID_MODIFICATION_ERR'; 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case FileError.INVALID_STATE_ERR: 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg = 'INVALID_STATE_ERR'; 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg = 'Unknown Error'; 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) console.error('Error: ' + msg); 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.showError_(str('accessFileFailure')); 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Handles changing of selectedItem in wallpaper manager. 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WallpaperManager.prototype.onSelectedItemChanged_ = function() { 649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this.setWallpaperAttribution_(this.selectedItem_); 650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!this.selectedItem_ || this.selectedItem_.source == 'ADDNEW') 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (this.selectedItem_.baseURL && !this.wallpaperGrid_.inProgramSelection) { 655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (this.selectedItem_.source == Constants.WallpaperSourceEnum.Custom) { 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var items = {}; 657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var key = this.selectedItem_.baseURL; 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var self = this; 659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Constants.WallpaperLocalStorage.get(key, function(items) { 660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) self.selectedItem_.layout = 661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) items[key] ? items[key] : 'CENTER_CROPPED'; 662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) self.setSelectedWallpaper_(self.selectedItem_); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this.setSelectedWallpaper_(this.selectedItem_); 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set attributions of wallpaper with given URL. If URL is not valid, clear 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the attributions. 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {{baseURL: string, dynamicURL: string, layout: string, 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * author: string, authorWebsite: string, availableOffline: boolean}} 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * selectedItem selected wallpaper item in grid. 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WallpaperManager.prototype.setWallpaperAttribution_ = function(selectedItem) { 6791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Only online wallpapers have author and website attributes. All other type 6801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // of wallpapers should not show attributions. 6811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (selectedItem && 6821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) selectedItem.source == Constants.WallpaperSourceEnum.Online) { 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $('author-name').textContent = selectedItem.author; 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $('author-website').textContent = $('author-website').href = 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selectedItem.authorWebsite; 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome.wallpaperPrivate.getThumbnail(selectedItem.baseURL, 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selectedItem.source, 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function(data) { 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var img = $('attribute-image'); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (data) { 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var blob = new Blob([new Int8Array(data)], {'type' : 'image\/png'}); 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) img.src = window.URL.createObjectURL(blob); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) img.addEventListener('load', function(e) { 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window.URL.revokeObjectURL(this.src); 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) img.src = ''; 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $('wallpaper-attribute').hidden = false; 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) $('attribute-image').hidden = false; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $('wallpaper-attribute').hidden = true; 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) $('attribute-image').hidden = true; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $('author-name').textContent = ''; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $('author-website').textContent = $('author-website').href = ''; 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) $('attribute-image').src = ''; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Resize thumbnails grid and categories list to fit the new window size. 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WallpaperManager.prototype.onResize_ = function() { 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.wallpaperGrid_.redraw(); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.categoriesList_.redraw(); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 72058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Close the last opened overlay on pressing the Escape key. 72158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * @param {Event} event A keydown event. 72258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 72358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WallpaperManager.prototype.onKeyDown_ = function(event) { 72458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (event.keyCode == 27) { 72558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The last opened overlay coincides with the first match of querySelector 72658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // because the Error Container is declared in the DOM before the Wallpaper 72758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Selection Container. 72858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(bshe): Make the overlay selection not dependent on the DOM. 72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) var closeButtonSelector = '.overlay-container:not([hidden]) .close'; 73058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) var closeButton = this.document_.querySelector(closeButtonSelector); 73158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (closeButton) { 73258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) closeButton.click(); 73358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) event.preventDefault(); 73458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 73558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 73658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 73758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 73858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /** 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Constructs the categories list. 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WallpaperManager.prototype.initCategoriesList_ = function() { 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.categoriesList_ = $('categories-list'); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cr.ui.List.decorate(this.categoriesList_); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cr.ui.list calculates items in view port based on client height and item 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // height. However, categories list is displayed horizontally. So we should 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not calculate visible items here. Sets autoExpands to true to show every 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // item in the list. 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(bshe): Use ul to replace cr.ui.list for category list. 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.categoriesList_.autoExpands = true; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var self = this; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.categoriesList_.itemConstructor = function(entry) { 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return self.renderCategory_(entry); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.categoriesList_.selectionModel = new cr.ui.ListSingleSelectionModel(); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.categoriesList_.selectionModel.addEventListener( 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'change', this.onCategoriesChange_.bind(this)); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var categoriesDataModel = new cr.ui.ArrayDataModel([]); 761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (this.enableOnlineWallpaper_) { 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Adds all category as first category. 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) categoriesDataModel.push(str('allCategoryLabel')); 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (var key in this.manifest_.categories) { 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) categoriesDataModel.push(this.manifest_.categories[key]); 766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds custom category as last category. 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) categoriesDataModel.push(str('customCategoryLabel')); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.categoriesList_.dataModel = categoriesDataModel; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Constructs the element in categories list. 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} entry Text content of a category. 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WallpaperManager.prototype.renderCategory_ = function(entry) { 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var li = this.document_.createElement('li'); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cr.defineProperty(li, 'custom', cr.PropertyKind.BOOL_ATTR); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) li.custom = (entry == str('customCategoryLabel')); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cr.defineProperty(li, 'lead', cr.PropertyKind.BOOL_ATTR); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cr.defineProperty(li, 'selected', cr.PropertyKind.BOOL_ATTR); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var div = this.document_.createElement('div'); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) div.textContent = entry; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) li.appendChild(div); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return li; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handles the custom wallpaper which user selected from file manager. Called 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * when users select a file. 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WallpaperManager.prototype.onFileSelectorChanged_ = function() { 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var files = $('file-selector').files; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (files.length != 1) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) console.error('More than one files are selected or no file selected'); 7977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!files[0].type.match('image/jpeg') && 7987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) !files[0].type.match('image/png')) { 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.showError_(str('invalidWallpaper')); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var layout = getSelectedLayout(); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var self = this; 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var errorHandler = this.onFileSystemError_.bind(this); 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var setSelectedFile = function(file, layout, fileName) { 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var saveThumbnail = function(thumbnail) { 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var success = function(dirEntry) { 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dirEntry.getFile(fileName, {create: true}, function(fileEntry) { 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileEntry.createWriter(function(fileWriter) { 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileWriter.onwriteend = function(e) { 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) $('set-wallpaper-layout').disabled = false; 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var wallpaperInfo = { 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) baseURL: fileName, 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout: layout, 815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source: Constants.WallpaperSourceEnum.Custom, 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) availableOffline: true 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.wallpaperGrid_.dataModel.splice(0, 0, wallpaperInfo); 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.wallpaperGrid_.selectedItem = wallpaperInfo; 8206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) self.onWallpaperChanged_(wallpaperInfo, fileName); 821a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WallpaperUtil.saveToStorage(self.currentWallpaper_, layout, 822a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) false); 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileWriter.onerror = errorHandler; 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var blob = new Blob([new Int8Array(thumbnail)], 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {'type' : 'image\/jpeg'}); 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileWriter.write(blob); 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, errorHandler); 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, errorHandler); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.wallpaperDirs_.getDirectory(WallpaperDirNameEnum.THUMBNAIL, 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) success, errorHandler); 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var success = function(dirEntry) { 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dirEntry.getFile(fileName, {create: true}, function(fileEntry) { 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileEntry.createWriter(function(fileWriter) { 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileWriter.addEventListener('writeend', function(e) { 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var reader = new FileReader(); 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reader.readAsArrayBuffer(file); 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reader.addEventListener('error', errorHandler); 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reader.addEventListener('load', function(e) { 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.setCustomWallpaper(e.target.result, layout, true, fileName, 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) saveThumbnail, function() { 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.removeCustomWallpaper(fileName); 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) errorHandler(); 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileWriter.addEventListener('error', errorHandler); 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileWriter.write(file); 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, errorHandler); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, errorHandler); 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.wallpaperDirs_.getDirectory(WallpaperDirNameEnum.ORIGINAL, success, 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) errorHandler); 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setSelectedFile(files[0], layout, new Date().getTime().toString()); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Removes wallpaper and thumbnail with fileName from FileSystem. 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {string} fileName The file name of wallpaper and thumbnail to be 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * removed. 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.removeCustomWallpaper = function(fileName) { 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var errorHandler = this.onFileSystemError_.bind(this); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var self = this; 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var removeFile = function(fileName) { 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var success = function(dirEntry) { 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dirEntry.getFile(fileName, {create: false}, function(fileEntry) { 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileEntry.remove(function() { 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, errorHandler); 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, errorHandler); 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Removes copy of original. 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.wallpaperDirs_.getDirectory(WallpaperDirNameEnum.ORIGINAL, success, 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) errorHandler); 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Removes generated thumbnail. 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.wallpaperDirs_.getDirectory(WallpaperDirNameEnum.THUMBNAIL, success, 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) errorHandler); 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) removeFile(fileName); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Sets current wallpaper and generate thumbnail if generateThumbnail is true. 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {ArrayBuffer} wallpaper The binary representation of wallpaper. 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {string} layout The user selected wallpaper layout. 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {boolean} generateThumbnail True if need to generate thumbnail. 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {string} fileName The unique file name of wallpaper. 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {function(thumbnail):void} success Success callback. If 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * generateThumbnail is true, the callback parameter should have the 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * generated thumbnail. 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {function(e):void} failure Failure callback. Called when there is an 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * error from FileSystem. 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.setCustomWallpaper = function(wallpaper, 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout, 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generateThumbnail, 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileName, 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) success, 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) failure) { 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var self = this; 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var onFinished = function(opt_thumbnail) { 911cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (chrome.runtime.lastError != undefined && 912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) chrome.runtime.lastError.message != str('canceledWallpaper')) { 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.showError_(chrome.runtime.lastError.message); 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) $('set-wallpaper-layout').disabled = true; 915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) failure(); 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) success(opt_thumbnail); 918a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Custom wallpapers are not synced yet. If login on a different 919a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // computer after set a custom wallpaper, wallpaper wont change by sync. 920a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WallpaperUtil.saveWallpaperInfo(fileName, layout, 921a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Constants.WallpaperSourceEnum.Custom); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome.wallpaperPrivate.setCustomWallpaper(wallpaper, layout, 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generateThumbnail, 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileName, onFinished); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Handles the layout setting change of custom wallpaper. 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperManager.prototype.onWallpaperLayoutChanged_ = function() { 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var layout = getSelectedLayout(); 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var self = this; 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome.wallpaperPrivate.setCustomWallpaperLayout(layout, function() { 937cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (chrome.runtime.lastError != undefined && 938cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) chrome.runtime.lastError.message != str('canceledWallpaper')) { 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.showError_(chrome.runtime.lastError.message); 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.removeCustomWallpaper(fileName); 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) $('set-wallpaper-layout').disabled = true; 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 943a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WallpaperUtil.saveToStorage(self.currentWallpaper_, layout, false); 9446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) self.onWallpaperChanged_(self.wallpaperGrid_.activeItem, 9456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) self.currentWallpaper_); 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handles user clicking on a different category. 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WallpaperManager.prototype.onCategoriesChange_ = function() { 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var categoriesList = this.categoriesList_; 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var selectedIndex = categoriesList.selectionModel.selectedIndex; 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selectedIndex == -1) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var selectedListItem = categoriesList.getListItemByIndex(selectedIndex); 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var bar = $('bar'); 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bar.style.left = selectedListItem.offsetLeft + 'px'; 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bar.style.width = selectedListItem.offsetWidth + 'px'; 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var wallpapersDataModel = new cr.ui.ArrayDataModel([]); 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var selectedItem; 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selectedListItem.custom) { 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.document_.body.setAttribute('custom', ''); 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var errorHandler = this.onFileSystemError_.bind(this); 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var toArray = function(list) { 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Array.prototype.slice.call(list || [], 0); 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var self = this; 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var processResults = function(entries) { 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var i = 0; i < entries.length; i++) { 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var entry = entries[i]; 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var wallpaperInfo = { 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) baseURL: entry.name, 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The layout will be replaced by the actual value saved in 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // local storage when requested later. Layout is not important 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for constructing thumbnails grid, we use CENTER_CROPPED here 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to speed up the process of constructing. So we do not need to 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // wait for fetching correct layout. 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout: 'CENTER_CROPPED', 984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source: Constants.WallpaperSourceEnum.Custom, 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) availableOffline: true 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpapersDataModel.push(wallpaperInfo); 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (loadTimeData.getBoolean('isOEMDefaultWallpaper')) { 9901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) var oemDefaultWallpaperElement = { 9911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) baseURL: 'OemDefaultWallpaper', 9921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) layout: 'CENTER_CROPPED', 9931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) source: Constants.WallpaperSourceEnum.OEM, 9941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) availableOffline: true 9951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) }; 9961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) wallpapersDataModel.push(oemDefaultWallpaperElement); 9971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 9981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (var i = 0; i < wallpapersDataModel.length; i++) { 9991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (self.currentWallpaper_ == wallpapersDataModel.item(i).baseURL) 10001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) selectedItem = wallpapersDataModel.item(i); 10011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var lastElement = { 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) baseURL: '', 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout: '', 10051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) source: Constants.WallpaperSourceEnum.AddNew, 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) availableOffline: true 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpapersDataModel.push(lastElement); 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.wallpaperGrid_.dataModel = wallpapersDataModel; 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.wallpaperGrid_.selectedItem = selectedItem; 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.wallpaperGrid_.activeItem = selectedItem; 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var success = function(dirEntry) { 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var dirReader = dirEntry.createReader(); 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var entries = []; 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All of a directory's entries are not guaranteed to return in a single 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // call. 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var readEntries = function() { 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dirReader.readEntries(function(results) { 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!results.length) { 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) processResults(entries.sort()); 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entries = entries.concat(toArray(results)); 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) readEntries(); 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, errorHandler); 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) readEntries(); // Start reading dirs. 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.wallpaperDirs_.getDirectory(WallpaperDirNameEnum.ORIGINAL, 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) success, errorHandler); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.document_.body.removeAttribute('custom'); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var key in this.manifest_.wallpaper_list) { 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (selectedIndex == AllCategoryIndex || 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.manifest_.wallpaper_list[key].categories.indexOf( 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selectedIndex - OnlineCategoriesOffset) != -1) { 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var wallpaperInfo = { 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) baseURL: this.manifest_.wallpaper_list[key].base_url, 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout: this.manifest_.wallpaper_list[key].default_layout, 1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source: Constants.WallpaperSourceEnum.Online, 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) availableOffline: false, 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) author: this.manifest_.wallpaper_list[key].author, 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) authorWebsite: this.manifest_.wallpaper_list[key].author_website, 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dynamicURL: this.manifest_.wallpaper_list[key].dynamic_url 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var startIndex = wallpaperInfo.baseURL.lastIndexOf('/') + 1; 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var fileName = wallpaperInfo.baseURL.substring(startIndex) + 1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Constants.HighResolutionSuffix; 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (this.downloadedListMap_ && 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.downloadedListMap_.hasOwnProperty(encodeURI(fileName))) { 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpaperInfo.availableOffline = true; 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wallpapersDataModel.push(wallpaperInfo); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var url = this.manifest_.wallpaper_list[key].base_url + 1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Constants.HighResolutionSuffix; 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url == this.currentWallpaper_) { 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selectedItem = wallpaperInfo; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.wallpaperGrid_.dataModel = wallpapersDataModel; 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.wallpaperGrid_.selectedItem = selectedItem; 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.wallpaperGrid_.activeItem = selectedItem; 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})(); 1070