Home | History | Annotate | Download | only in login
      1 // Copyright 2014 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  * @fileoverview controller pairing screen implementation.
      7  */
      8 
      9 login.createScreen('ControllerPairingScreen', 'controller-pairing', function() {
     10   'use strict';
     11 
     12   // Keep these constants synced with corresponding constants defined in
     13   // controller_pairing_screen_actor.{h,cc}.
     14   /** @const */ var CONTEXT_KEY_PAGE = 'page';
     15   /** @const */ var CONTEXT_KEY_CONTROLS_DISABLED = 'controlsDisabled';
     16   /** @const */ var CONTEXT_KEY_DEVICES = 'devices';
     17   /** @const */ var CONTEXT_KEY_CONFIRMATION_CODE = 'code';
     18   /** @const */ var CONTEXT_KEY_SELECTED_DEVICE = 'selectedDevice';
     19   /** @const */ var CONTEXT_KEY_ACCOUNT_ID = 'accountId';
     20   /** @const */ var CONTEXT_KEY_ENROLLMENT_DOMAIN = 'enrollmentDomain';
     21 
     22   /** @const */ var ACTION_ENROLL = 'enroll';
     23 
     24   /** @const */ var PAGE_DEVICES_DISCOVERY = 'devices-discovery';
     25   /** @const */ var PAGE_DEVICE_SELECT = 'device-select';
     26   /** @const */ var PAGE_DEVICE_NOT_FOUND = 'device-not-found';
     27   /** @const */ var PAGE_ESTABLISHING_CONNECTION = 'establishing-connection';
     28   /** @const */ var PAGE_ESTABLISHING_CONNECTION_ERROR =
     29       'establishing-connection-error';
     30   /** @const */ var PAGE_CODE_CONFIRMATION = 'code-confirmation';
     31   /** @const */ var PAGE_HOST_UPDATE = 'host-update';
     32   /** @const */ var PAGE_HOST_CONNECTION_LOST = 'host-connection-lost';
     33   /** @const */ var PAGE_ENROLLMENT_INTRODUCTION = 'enrollment-introduction';
     34   /** @const */ var PAGE_AUTHENTICATION = 'authentication';
     35   /** @const */ var PAGE_HOST_ENROLLMENT = 'host-enrollment';
     36   /** @const */ var PAGE_HOST_ENROLLMENT_ERROR = 'host-enrollment-error';
     37   /** @const */ var PAGE_PAIRING_DONE = 'pairing-done';
     38 
     39   /** @const */ var PAGE_NAMES = [
     40       PAGE_DEVICES_DISCOVERY,
     41       PAGE_DEVICE_SELECT,
     42       PAGE_DEVICE_NOT_FOUND,
     43       PAGE_ESTABLISHING_CONNECTION,
     44       PAGE_ESTABLISHING_CONNECTION_ERROR,
     45       PAGE_CODE_CONFIRMATION,
     46       PAGE_HOST_UPDATE,
     47       PAGE_HOST_CONNECTION_LOST,
     48       PAGE_ENROLLMENT_INTRODUCTION,
     49       PAGE_AUTHENTICATION,
     50       PAGE_HOST_ENROLLMENT,
     51       PAGE_HOST_ENROLLMENT_ERROR,
     52       PAGE_PAIRING_DONE];
     53 
     54   return {
     55     deviceSelectionChangedCallback_: null,
     56     gaiaHost_: null,
     57     pages_: null,
     58 
     59     /** @override */
     60     decorate: function() {
     61       this.initialize();
     62 
     63       this.pages_ = {};
     64       PAGE_NAMES.forEach(function(pageName) {
     65         var page = this.querySelector('.page-' + pageName);
     66         if (page === null)
     67           throw Error('Page "' + pageName + '" was not found.');
     68         page.hidden = true;
     69         this.pages_[pageName] = page;
     70       }, this);
     71 
     72       this.disableControls_(true);
     73 
     74       this.addContextObserver(CONTEXT_KEY_PAGE, this.pageChanged_);
     75       this.addContextObserver(CONTEXT_KEY_CONTROLS_DISABLED,
     76           this.disableControls_);
     77 
     78       cr.ui.List.decorate(this.deviceList_);
     79       this.deviceList_.selectionModel = new cr.ui.ListSingleSelectionModel();
     80 
     81       this.gaiaHost_ = new cr.login.GaiaAuthHost(this.gaiaFrame_);
     82 
     83       this.deviceSelectionChangedCallback_ =
     84           this.deviceSelectionChanged_.bind(this);
     85     },
     86 
     87     pageChanged_: function(newPage, oldPage) {
     88       this.throbber_.hidden = [PAGE_DEVICES_DISCOVERY,
     89                                PAGE_DEVICE_SELECT,
     90                                PAGE_ESTABLISHING_CONNECTION,
     91                                PAGE_HOST_UPDATE,
     92                                PAGE_HOST_CONNECTION_LOST,
     93                                PAGE_HOST_ENROLLMENT].indexOf(newPage) == -1;
     94       this.togglePage_(newPage);
     95       if (newPage == PAGE_DEVICE_SELECT) {
     96         this.addContextObserver(CONTEXT_KEY_DEVICES, this.setDeviceList_);
     97         this.addContextObserver(CONTEXT_KEY_SELECTED_DEVICE,
     98             this.setSelectedDevice_);
     99         this.setDeviceList_(this.context.get(CONTEXT_KEY_DEVICES));
    100         this.deviceList_.addEventListener('change',
    101             this.deviceSelectionChangedCallback_);
    102       } else if (oldPage == PAGE_DEVICE_SELECT) {
    103         this.removeContextObserver(this.setDeviceList_);
    104         this.removeContextObserver(this.setSelectedDevice_);
    105         this.deviceList_.removeEventListener('change',
    106             this.deviceSelectionChangedCallback_);
    107       }
    108 
    109       if (newPage == PAGE_CODE_CONFIRMATION) {
    110         // TODO(dzhioev): replace with i18n pattern.
    111         this.confirmationCodeLabel_.textContent =
    112             this.context.get(CONTEXT_KEY_CONFIRMATION_CODE) + '?';
    113       }
    114 
    115       if (newPage == PAGE_AUTHENTICATION) {
    116         this.gaiaHost_.load(cr.login.GaiaAuthHost.AuthMode.DEFAULT,
    117                             {},
    118                             this.onAuthCompleted_.bind(this));
    119       }
    120 
    121       if (newPage == PAGE_HOST_ENROLLMENT) {
    122         this.domainNameLabel_.textContent =
    123             this.context.get(CONTEXT_KEY_ENROLLMENT_DOMAIN);
    124       }
    125 
    126       this.pageNameLabel_.textContent = '<<<< ' + newPage + ' >>>>';
    127     },
    128 
    129     togglePage_: function(newPage) {
    130       PAGE_NAMES.forEach(function(pageName) {
    131         this.pages_[pageName].hidden = (pageName !== newPage);
    132       }, this);
    133     },
    134 
    135     setDeviceList_: function(deviceList) {
    136       this.deviceList_.removeEventListener('change',
    137           this.deviceSelectionChangedCallback_);
    138 
    139       this.deviceList_.dataModel = new cr.ui.ArrayDataModel(deviceList);
    140       this.setSelectedDevice_(this.context.get(CONTEXT_KEY_SELECTED_DEVICE));
    141 
    142       this.deviceList_.addEventListener('change',
    143           this.deviceSelectionChangedCallback_);
    144     },
    145 
    146     setSelectedDevice_: function(selectedDevice) {
    147       this.deviceList_.selectedItem = selectedDevice;
    148     },
    149 
    150     deviceSelectionChanged_: function() {
    151       var item = this.deviceList_.selectedItem;
    152       this.context.set(CONTEXT_KEY_SELECTED_DEVICE, item ? item : '');
    153       this.commitContextChanges();
    154     },
    155 
    156     disableControls_: function(disable) {
    157       this.querySelectorAll('button').forEach(function(button) {
    158         button.disabled = disable;
    159       });
    160       this.context.set(CONTEXT_KEY_CONTROLS_DISABLED, disable);
    161       this.commitContextChanges();
    162     },
    163 
    164     onAuthCompleted_: function(credentials) {
    165       this.context.set(CONTEXT_KEY_ACCOUNT_ID, credentials.email);
    166       this.commitContextChanges();
    167       this.send(login.Screen.CALLBACK_USER_ACTED, ACTION_ENROLL);
    168     }
    169   };
    170 });
    171 
    172