• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 Account picker screen implementation.
7 */
8
9login.createScreen('AccountPickerScreen', 'account-picker', function() {
10  /**
11   * Maximum number of offline login failures before online login.
12   * @type {number}
13   * @const
14   */
15  var MAX_LOGIN_ATTEMPTS_IN_POD = 3;
16
17  return {
18    EXTERNAL_API: [
19      'loadUsers',
20      'runAppForTesting',
21      'setApps',
22      'setShouldShowApps',
23      'showAppError',
24      'updateUserImage',
25      'setCapsLockState',
26      'forceLockedUserPodFocus',
27      'removeUser',
28      'showBannerMessage',
29      'showUserPodCustomIcon',
30      'hideUserPodCustomIcon',
31      'setAuthType',
32      'setTouchViewState',
33      'setPublicSessionDisplayName',
34      'setPublicSessionLocales',
35      'setPublicSessionKeyboardLayouts',
36    ],
37
38    preferredWidth_: 0,
39    preferredHeight_: 0,
40
41    // Whether this screen is shown for the first time.
42    firstShown_: true,
43
44    /** @override */
45    decorate: function() {
46      login.PodRow.decorate($('pod-row'));
47    },
48
49    /** @override */
50    getPreferredSize: function() {
51      return {width: this.preferredWidth_, height: this.preferredHeight_};
52    },
53
54    /** @override */
55    onWindowResize: function() {
56      $('pod-row').onWindowResize();
57    },
58
59    /**
60     * Sets preferred size for account picker screen.
61     */
62    setPreferredSize: function(width, height) {
63      this.preferredWidth_ = width;
64      this.preferredHeight_ = height;
65    },
66
67    /**
68     * When the account picker is being used to lock the screen, pressing the
69     * exit accelerator key will sign out the active user as it would when
70     * they are signed in.
71     */
72    exit: function() {
73      // Check and disable the sign out button so that we can never have two
74      // sign out requests generated in a row.
75      if ($('pod-row').lockedPod && !$('sign-out-user-button').disabled) {
76        $('sign-out-user-button').disabled = true;
77        chrome.send('signOutUser');
78      }
79    },
80
81    /* Cancel user adding if ESC was pressed.
82     */
83    cancel: function() {
84      if (Oobe.getInstance().displayType == DISPLAY_TYPE.USER_ADDING)
85        chrome.send('cancelUserAdding');
86    },
87
88    /**
89     * Event handler that is invoked just after the frame is shown.
90     * @param {string} data Screen init payload.
91     */
92    onAfterShow: function(data) {
93      $('pod-row').handleAfterShow();
94    },
95
96    /**
97     * Event handler that is invoked just before the frame is shown.
98     * @param {string} data Screen init payload.
99     */
100    onBeforeShow: function(data) {
101      chrome.send('loginUIStateChanged', ['account-picker', true]);
102      $('login-header-bar').signinUIState = SIGNIN_UI_STATE.ACCOUNT_PICKER;
103      chrome.send('hideCaptivePortal');
104      var podRow = $('pod-row');
105      podRow.handleBeforeShow();
106
107      // In case of the preselected pod onShow will be called once pod
108      // receives focus.
109      if (!podRow.preselectedPod)
110        this.onShow();
111    },
112
113    /**
114     * Event handler invoked when the page is shown and ready.
115     */
116    onShow: function() {
117      chrome.send('getTouchViewState');
118      if (!this.firstShown_) return;
119      this.firstShown_ = false;
120
121      // Ensure that login is actually visible.
122      window.requestAnimationFrame(function() {
123        chrome.send('accountPickerReady');
124        chrome.send('loginVisible', ['account-picker']);
125      });
126    },
127
128    /**
129     * Event handler that is invoked just before the frame is hidden.
130     */
131    onBeforeHide: function() {
132      chrome.send('loginUIStateChanged', ['account-picker', false]);
133      $('login-header-bar').signinUIState = SIGNIN_UI_STATE.HIDDEN;
134      $('pod-row').handleHide();
135    },
136
137    /**
138     * Shows sign-in error bubble.
139     * @param {number} loginAttempts Number of login attemps tried.
140     * @param {HTMLElement} content Content to show in bubble.
141     */
142    showErrorBubble: function(loginAttempts, error) {
143      var activatedPod = $('pod-row').activatedPod;
144      if (!activatedPod) {
145        $('bubble').showContentForElement($('pod-row'),
146                                          cr.ui.Bubble.Attachment.RIGHT,
147                                          error);
148        return;
149      }
150      // Show web authentication if this is not a supervised user.
151      if (loginAttempts > MAX_LOGIN_ATTEMPTS_IN_POD &&
152          !activatedPod.user.supervisedUser) {
153        activatedPod.showSigninUI();
154      } else {
155        // We want bubble's arrow to point to the first letter of input.
156        /** @const */ var BUBBLE_OFFSET = 7;
157        /** @const */ var BUBBLE_PADDING = 4;
158        $('bubble').showContentForElement(activatedPod.mainInput,
159                                          cr.ui.Bubble.Attachment.BOTTOM,
160                                          error,
161                                          BUBBLE_OFFSET, BUBBLE_PADDING);
162        // Move error bubble up if it overlaps the shelf.
163        var maxHeight =
164            cr.ui.LoginUITools.getMaxHeightBeforeShelfOverlapping($('bubble'));
165        if (maxHeight < $('bubble').offsetHeight) {
166          $('bubble').showContentForElement(activatedPod.mainInput,
167                                            cr.ui.Bubble.Attachment.TOP,
168                                            error,
169                                            BUBBLE_OFFSET, BUBBLE_PADDING);
170        }
171      }
172    },
173
174    /**
175     * Loads given users in pod row.
176     * @param {array} users Array of user.
177     * @param {boolean} showGuest Whether to show guest session button.
178     */
179    loadUsers: function(users, showGuest) {
180      $('pod-row').loadPods(users);
181      $('login-header-bar').showGuestButton = showGuest;
182    },
183
184    /**
185     * Runs app with a given id from the list of loaded apps.
186     * @param {!string} app_id of an app to run.
187     * @param {boolean=} opt_diagnostic_mode Whether to run the app in
188     *     diagnostic mode.  Default is false.
189     */
190    runAppForTesting: function(app_id, opt_diagnostic_mode) {
191      $('pod-row').findAndRunAppForTesting(app_id, opt_diagnostic_mode);
192    },
193
194    /**
195     * Adds given apps to the pod row.
196     * @param {array} apps Array of apps.
197     */
198    setApps: function(apps) {
199      $('pod-row').setApps(apps);
200    },
201
202    /**
203     * Sets the flag of whether app pods should be visible.
204     * @param {boolean} shouldShowApps Whether to show app pods.
205     */
206    setShouldShowApps: function(shouldShowApps) {
207      $('pod-row').setShouldShowApps(shouldShowApps);
208    },
209
210    /**
211     * Shows the given kiosk app error message.
212     * @param {!string} message Error message to show.
213     */
214    showAppError: function(message) {
215      // TODO(nkostylev): Figure out a way to show kiosk app launch error
216      // pointing to the kiosk app pod.
217      /** @const */ var BUBBLE_PADDING = 12;
218      $('bubble').showTextForElement($('pod-row'),
219                                     message,
220                                     cr.ui.Bubble.Attachment.BOTTOM,
221                                     $('pod-row').offsetWidth / 2,
222                                     BUBBLE_PADDING);
223    },
224
225    /**
226     * Updates current image of a user.
227     * @param {string} username User for which to update the image.
228     */
229    updateUserImage: function(username) {
230      $('pod-row').updateUserImage(username);
231    },
232
233    /**
234     * Updates Caps Lock state (for Caps Lock hint in password input field).
235     * @param {boolean} enabled Whether Caps Lock is on.
236     */
237    setCapsLockState: function(enabled) {
238      $('pod-row').classList.toggle('capslock-on', enabled);
239    },
240
241    /**
242     * Enforces focus on user pod of locked user.
243     */
244    forceLockedUserPodFocus: function() {
245      var row = $('pod-row');
246      if (row.lockedPod)
247        row.focusPod(row.lockedPod, true);
248    },
249
250    /**
251     * Remove given user from pod row if it is there.
252     * @param {string} user name.
253     */
254    removeUser: function(username) {
255      $('pod-row').removeUserPod(username);
256    },
257
258    /**
259     * Displays a banner containing |message|. If the banner is already present
260     * this function updates the message in the banner. This function is used
261     * by the chrome.screenlockPrivate.showMessage API.
262     * @param {string} message Text to be displayed
263     */
264    showBannerMessage: function(message) {
265      var banner = $('signin-banner');
266      banner.textContent = message;
267      banner.classList.toggle('message-set', true);
268    },
269
270    /**
271     * Shows a custom icon in the user pod of |username|. This function
272     * is used by the chrome.screenlockPrivate API.
273     * @param {string} username Username of pod to add button
274     * @param {!{id: !string,
275     *           hardlockOnClick: boolean,
276     *           tooltip: ({text: string, autoshow: boolean} | undefined)}} icon
277     *     The icon parameters.
278     */
279    showUserPodCustomIcon: function(username, icon) {
280      $('pod-row').showUserPodCustomIcon(username, icon);
281    },
282
283    /**
284     * Hides the custom icon in the user pod of |username| added by
285     * showUserPodCustomIcon(). This function is used by the
286     * chrome.screenlockPrivate API.
287     * @param {string} username Username of pod to remove button
288     */
289    hideUserPodCustomIcon: function(username) {
290      $('pod-row').hideUserPodCustomIcon(username);
291    },
292
293    /**
294     * Sets the authentication type used to authenticate the user.
295     * @param {string} username Username of selected user
296     * @param {number} authType Authentication type, must be a valid value in
297     *                          the AUTH_TYPE enum in user_pod_row.js.
298     * @param {string} value The initial value to use for authentication.
299     */
300    setAuthType: function(username, authType, value) {
301      $('pod-row').setAuthType(username, authType, value);
302    },
303
304    /**
305     * Sets the state of touch view mode.
306     * @param {boolean} isTouchViewEnabled true if the mode is on.
307     */
308    setTouchViewState: function(isTouchViewEnabled) {
309      $('pod-row').setTouchViewState(isTouchViewEnabled);
310    },
311
312    /**
313     * Updates the display name shown on a public session pod.
314     * @param {string} userID The user ID of the public session
315     * @param {string} displayName The new display name
316     */
317    setPublicSessionDisplayName: function(userID, displayName) {
318      $('pod-row').setPublicSessionDisplayName(userID, displayName);
319    },
320
321    /**
322     * Updates the list of locales available for a public session.
323     * @param {string} userID The user ID of the public session
324     * @param {!Object} locales The list of available locales
325     * @param {string} defaultLocale The locale to select by default
326     * @param {boolean} multipleRecommendedLocales Whether |locales| contains
327     *     two or more recommended locales
328     */
329    setPublicSessionLocales: function(userID,
330                                      locales,
331                                      defaultLocale,
332                                      multipleRecommendedLocales) {
333      $('pod-row').setPublicSessionLocales(userID,
334                                           locales,
335                                           defaultLocale,
336                                           multipleRecommendedLocales);
337    },
338
339    /**
340     * Updates the list of available keyboard layouts for a public session pod.
341     * @param {string} userID The user ID of the public session
342     * @param {string} locale The locale to which this list of keyboard layouts
343     *     applies
344     * @param {!Object} list List of available keyboard layouts
345     */
346    setPublicSessionKeyboardLayouts: function(userID, locale, list) {
347      $('pod-row').setPublicSessionKeyboardLayouts(userID, locale, list);
348    }
349  };
350});
351
352