system_private_api.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
1689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira// Use of this source code is governed by a BSD-style license that can be
3689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira// found in the LICENSE file.
4689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira
5689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/browser/extensions/api/system_private/system_private_api.h"
6689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira
7689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "base/prefs/pref_service.h"
8689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "base/values.h"
9689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/browser/browser_process.h"
10689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/browser/extensions/event_router_forwarder.h"
11689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/browser/profiles/profile.h"
12689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/common/extensions/api/system_private.h"
13689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/common/pref_names.h"
14689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "google_apis/google_api_keys.h"
15689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira
16689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#if defined(OS_CHROMEOS)
17689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chromeos/dbus/dbus_thread_manager.h"
18689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chromeos/dbus/update_engine_client.h"
19689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#else
20689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/browser/upgrade_detector.h"
21689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#endif
22689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira
23689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiranamespace {
24689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira
25689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira// Maps prefs::kIncognitoModeAvailability values (0 = enabled, ...)
26689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira// to strings exposed to extensions.
27689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiraconst char* kIncognitoModeAvailabilityStrings[] = {
28689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  "enabled",
29689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  "disabled",
30689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  "forced"
3174437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira};
32689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira
33689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira// Property keys.
34689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiraconst char kBrightnessKey[] = "brightness";
35689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiraconst char kDownloadProgressKey[] = "downloadProgress";
36689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiraconst char kIsVolumeMutedKey[] = "isVolumeMuted";
37d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereiraconst char kStateKey[] = "state";
38d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereiraconst char kUserInitiatedKey[] = "userInitiated";
39689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiraconst char kVolumeKey[] = "volume";
40689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira
4174437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira// System update states.
42d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereiraconst char kNotAvailableState[] = "NotAvailable";
43d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereiraconst char kNeedRestartState[] = "NeedRestart";
44689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira
45689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#if defined(OS_CHROMEOS)
46689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiraconst char kUpdatingState[] = "Updating";
47689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#endif  // defined(OS_CHROMEOS)
48dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira
49dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira// Dispatches an extension event with |argument|
50689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiravoid DispatchEvent(const std::string& event_name, base::Value* argument) {
51689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  scoped_ptr<base::ListValue> list_args(new base::ListValue());
52689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  if (argument) {
53689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira    list_args->Append(argument);
54689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  }
55dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira  g_browser_process->extension_event_router_forwarder()->
56689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      BroadcastEventToRenderers(event_name, list_args.Pass(), GURL());
57d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira}
58dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira
59d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira}  // namespace
60689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira
61689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiranamespace extensions {
62689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira
63689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiranamespace system_private = api::system_private;
64689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira
65689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereirabool SystemPrivateGetIncognitoModeAvailabilityFunction::RunImpl() {
6674437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira  PrefService* prefs = GetProfile()->GetPrefs();
67dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira  int value = prefs->GetInteger(prefs::kIncognitoModeAvailability);
68dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira  EXTENSION_FUNCTION_VALIDATE(
69689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      value >= 0 &&
70689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      value < static_cast<int>(arraysize(kIncognitoModeAvailabilityStrings)));
71dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira  SetResult(new base::StringValue(kIncognitoModeAvailabilityStrings[value]));
72dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira  return true;
73dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira}
74689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira
75689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereirabool SystemPrivateGetUpdateStatusFunction::RunImpl() {
76689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  std::string state;
77689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  double download_progress = 0;
78689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#if defined(OS_CHROMEOS)
79689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  // With UpdateEngineClient, we can provide more detailed information about
80689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  // system updates on ChromeOS.
81689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  const chromeos::UpdateEngineClient::Status status =
82689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()->
83689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      GetLastStatus();
84689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  // |download_progress| is set to 1 after download finishes
85689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  // (i.e. verify, finalize and need-reboot phase) to indicate the progress
86689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  // even though |status.download_progress| is 0 in these phases.
87689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  switch (status.status) {
88689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira    case chromeos::UpdateEngineClient::UPDATE_STATUS_ERROR:
89689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      state = kNotAvailableState;
90689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      break;
91689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira    case chromeos::UpdateEngineClient::UPDATE_STATUS_IDLE:
92689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      state = kNotAvailableState;
9374437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira      break;
9474437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira    case chromeos::UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE:
9574437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira      state = kNotAvailableState;
96dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira      break;
97dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira    case chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE:
98dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira      state = kUpdatingState;
99dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira      break;
100dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira    case chromeos::UpdateEngineClient::UPDATE_STATUS_DOWNLOADING:
101dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira      state = kUpdatingState;
10274437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira      download_progress = status.download_progress;
103689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      break;
104689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira    case chromeos::UpdateEngineClient::UPDATE_STATUS_VERIFYING:
105689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      state = kUpdatingState;
106689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      download_progress = 1;
107689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      break;
108689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira    case chromeos::UpdateEngineClient::UPDATE_STATUS_FINALIZING:
109fa77943ee3d8ef33abf4f8288875783de623b4d9Mindy Pereira      state = kUpdatingState;
110689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      download_progress = 1;
111689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      break;
112689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira    case chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT:
113689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      state = kNeedRestartState;
114689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      download_progress = 1;
115689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      break;
116112ae3627e7f32991822b3fd2001fe7239f1d3eaMindy Pereira    case chromeos::UpdateEngineClient::UPDATE_STATUS_REPORTING_ERROR_EVENT:
117689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira      state = kNotAvailableState;
118dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira      break;
119689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  }
120689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#else
121689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  if (UpgradeDetector::GetInstance()->notify_upgrade()) {
122dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira    state = kNeedRestartState;
123dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira    download_progress = 1;
124689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  } else {
125689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira    state = kNotAvailableState;
126689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  }
127689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#endif
128689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  base::DictionaryValue* dict = new base::DictionaryValue();
129689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  dict->SetString(kStateKey, state);
130dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira  dict->SetDouble(kDownloadProgressKey, download_progress);
131dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira  SetResult(dict);
132d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira
133dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira  return true;
134dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira}
135689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira
136689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereirabool SystemPrivateGetApiKeyFunction::RunImpl() {
137d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira  SetResult(new base::StringValue(google_apis::GetAPIKey()));
138d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira  return true;
139d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira}
140d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira
141dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereiravoid DispatchVolumeChangedEvent(double volume, bool is_volume_muted) {
142dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira  base::DictionaryValue* dict = new base::DictionaryValue();
143d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira  dict->SetDouble(kVolumeKey, volume);
144dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira  dict->SetBoolean(kIsVolumeMutedKey, is_volume_muted);
145689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  DispatchEvent(system_private::OnVolumeChanged::kEventName, dict);
146dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira}
147dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira
148689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiravoid DispatchBrightnessChangedEvent(int brightness, bool user_initiated) {
149dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira  base::DictionaryValue* dict = new base::DictionaryValue();
150dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira  dict->SetInteger(kBrightnessKey, brightness);
151689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  dict->SetBoolean(kUserInitiatedKey, user_initiated);
152689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira  DispatchEvent(system_private::OnBrightnessChanged::kEventName, dict);
153689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira}
154d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira
155d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereiravoid DispatchScreenUnlockedEvent() {
156d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira  DispatchEvent(system_private::OnScreenUnlocked::kEventName, NULL);
15774437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira}
15874437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira
15974437a01478b39230bb5b4657b74480ede53ae94Mindy Pereiravoid DispatchWokeUpEvent() {
16074437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira  DispatchEvent(system_private::OnWokeUp::kEventName, NULL);
161d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira}
162d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira
163d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira}  // namespace extensions
16474437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira