Home | History | Annotate | Download | only in chromeos
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 /**
      6  * The type of the app data object. The definition is based on
      7  * chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.cc:
      8  *     PopulateAppDict()
      9  * @typedef {{id: string,
     10  *            name: string,
     11  *            iconURL: string,
     12  *            autoLaunch: boolean,
     13  *            isLoading: boolean}}
     14  */
     15 var AppDict;
     16 
     17 cr.define('extensions', function() {
     18   /** @const */ var List = cr.ui.List;
     19   /** @const */ var ListItem = cr.ui.ListItem;
     20   /** @const */ var ArrayDataModel = cr.ui.ArrayDataModel;
     21 
     22   /**
     23    * Creates a list for showing kiosk apps.
     24    * @constructor
     25    * @extends {cr.ui.List}
     26    */
     27   var KioskAppList = cr.ui.define('list');
     28 
     29   KioskAppList.prototype = {
     30     __proto__: List.prototype,
     31 
     32     /**
     33      * True if auto launch feature can be configured.
     34      * @type {?boolean}
     35      */
     36     autoLaunchEnabled_: false,
     37 
     38     /** @override */
     39     createItem: function(app) {
     40       var item = new KioskAppListItem();
     41       item.data = app;
     42       item.autoLaunchEnabled = this.autoLaunchEnabled_;
     43       return item;
     44     },
     45 
     46     /**
     47      * Sets auto launch enabled flag.
     48      * @param {boolean} enabled True if auto launch should be enabled.
     49      */
     50     setAutoLaunchEnabled: function(enabled) {
     51       this.autoLaunchEnabled_ = enabled;
     52     },
     53 
     54     /**
     55      * Loads the given list of apps.
     56      * @param {!Array.<!Object>} apps An array of app info objects.
     57      */
     58     setApps: function(apps) {
     59       this.dataModel = new ArrayDataModel(apps);
     60     },
     61 
     62     /**
     63      * Updates the given app.
     64      * @param {!AppDict} app An app info object.
     65      */
     66     updateApp: function(app) {
     67       for (var i = 0; i < this.items.length; ++i) {
     68         if (this.items[i].data.id == app.id) {
     69           this.items[i].data = app;
     70           break;
     71         }
     72       }
     73     }
     74   };
     75 
     76   /**
     77    * Creates a list item for a kiosk app.
     78    * @constructor
     79    * @extends {cr.ui.ListItem}
     80    */
     81   var KioskAppListItem = cr.ui.define(function() {
     82     var el = $('kiosk-app-list-item-template').cloneNode(true);
     83     el.removeAttribute('id');
     84     el.hidden = false;
     85     return el;
     86   });
     87 
     88   KioskAppListItem.prototype = {
     89     __proto__: ListItem.prototype,
     90 
     91     /**
     92      * Data object to hold app info.
     93      * @type {Object}
     94      * @private
     95      */
     96     data_: null,
     97 
     98     get data() {
     99       assert(this.data_);
    100       return this.data_;
    101     },
    102 
    103     set data(data) {
    104       this.data_ = data;
    105       this.redraw();
    106     },
    107 
    108     set autoLaunchEnabled(enabled) {
    109       this.querySelector('.enable-auto-launch-button').hidden = !enabled;
    110       this.querySelector('.disable-auto-launch-button').hidden = !enabled;
    111     },
    112 
    113     /**
    114      * Getter for the icon element.
    115      * @type {Element}
    116      */
    117     get icon() {
    118       return this.querySelector('.kiosk-app-icon');
    119     },
    120 
    121     /**
    122      * Getter for the name element.
    123      * @type {Element}
    124      */
    125     get name() {
    126       return this.querySelector('.kiosk-app-name');
    127     },
    128 
    129     /**
    130      * Getter for the status text element.
    131      * @type {Element}
    132      */
    133     get status() {
    134       return this.querySelector('.kiosk-app-status');
    135     },
    136 
    137     /** @override */
    138     decorate: function() {
    139       ListItem.prototype.decorate.call(this);
    140 
    141       var sendMessageWithId = function(msg) {
    142         return function() {
    143           chrome.send(msg, [this.data.id]);
    144         }.bind(this);
    145       }.bind(this);
    146 
    147       this.querySelector('.enable-auto-launch-button').onclick =
    148         sendMessageWithId('enableKioskAutoLaunch');
    149       this.querySelector('.disable-auto-launch-button').onclick =
    150         sendMessageWithId('disableKioskAutoLaunch');
    151       this.querySelector('.row-delete-button').onclick =
    152           sendMessageWithId('removeKioskApp');
    153     },
    154 
    155     /**
    156      * Updates UI from app info data.
    157      */
    158     redraw: function() {
    159       this.icon.classList.toggle('spinner', this.data.isLoading);
    160       this.icon.style.backgroundImage = 'url(' + this.data.iconURL + ')';
    161 
    162       this.name.textContent = this.data.name || this.data.id;
    163       this.status.textContent = this.data.autoLaunch ?
    164           loadTimeData.getString('autoLaunch') : '';
    165 
    166       this.autoLaunch = this.data.autoLaunch;
    167     }
    168   };
    169 
    170   /**
    171    * True if the app represented by this item will auto launch.
    172    */
    173   cr.defineProperty(KioskAppListItem, 'autoLaunch', cr.PropertyKind.BOOL_ATTR);
    174 
    175   // Export
    176   return {
    177     KioskAppList: KioskAppList
    178   };
    179 });
    180