12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * States that the extension can be in.
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var StateEnum = {
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISABLED: 'disabled',
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISPLAY: 'display',
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SYSTEM: 'system'
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Key used for storing the current state in {localStorage}.
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var STATE_KEY = 'state';
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Loads the locally-saved state asynchronously.
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {function} callback Callback invoked with the loaded {StateEnum}.
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function loadSavedState(callback) {
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chrome.storage.local.get(STATE_KEY, function(items) {
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    var savedState = items[STATE_KEY];
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (var key in StateEnum) {
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (savedState == StateEnum[key]) {
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        callback(savedState);
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    callback(StateEnum.DISABLED);
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  });
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Switches to a new state.
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string} newState New {StateEnum} to use.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function setState(newState) {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var imagePrefix = 'night';
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var title = '';
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (newState) {
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case StateEnum.DISABLED:
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      chrome.power.releaseKeepAwake();
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      imagePrefix = 'night';
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      title = chrome.i18n.getMessage('disabledTitle');
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case StateEnum.DISPLAY:
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      chrome.power.requestKeepAwake('display');
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      imagePrefix = 'day';
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      title = chrome.i18n.getMessage('displayTitle');
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case StateEnum.SYSTEM:
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome.power.requestKeepAwake('system');
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      imagePrefix = 'sunset';
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      title = chrome.i18n.getMessage('systemTitle');
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      throw 'Invalid state "' + newState + '"';
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var items = {};
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  items[STATE_KEY] = newState;
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chrome.storage.local.set(items);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome.browserAction.setIcon({
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    path: {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      '19': 'images/' + imagePrefix + '-19.png',
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      '38': 'images/' + imagePrefix + '-38.png'
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  });
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome.browserAction.setTitle({title: title});
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)chrome.browserAction.onClicked.addListener(function() {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  loadSavedState(function(state) {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (state) {
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case StateEnum.DISABLED:
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        setState(StateEnum.DISPLAY);
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case StateEnum.DISPLAY:
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        setState(StateEnum.SYSTEM);
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case StateEnum.SYSTEM:
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        setState(StateEnum.DISABLED);
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default:
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        throw 'Invalid state "' + state + '"';
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  });
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)});
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)chrome.runtime.onStartup.addListener(function() {
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  loadSavedState(function(state) { setState(state); });
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)});
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(derat): Remove this once http://crbug.com/222473 is fixed.
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)chrome.windows.onCreated.addListener(function() {
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  loadSavedState(function(state) { setState(state); });
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)});
103