15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/system_private/system_private_api.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/event_router_forwarder.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/extensions/api/system_private.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "google_apis/google_api_keys.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/update_engine_client.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/upgrade_detector.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maps prefs::kIncognitoModeAvailability values (0 = enabled, ...)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to strings exposed to extensions.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kIncognitoModeAvailabilityStrings[] = {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "enabled",
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "disabled",
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "forced"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property keys.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kBrightnessKey[] = "brightness";
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDownloadProgressKey[] = "downloadProgress";
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kIsVolumeMutedKey[] = "isVolumeMuted";
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kStateKey[] = "state";
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUserInitiatedKey[] = "userInitiated";
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kVolumeKey[] = "volume";
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// System update states.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNotAvailableState[] = "NotAvailable";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNeedRestartState[] = "NeedRestart";
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_CHROMEOS)
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kUpdatingState[] = "Updating";
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dispatches an extension event with |argument|
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DispatchEvent(const std::string& event_name, base::Value* argument) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> list_args(new base::ListValue());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (argument) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list_args->Append(argument);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_browser_process->extension_event_router_forwarder()->
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BroadcastEventToRenderers(event_name, list_args.Pass(), GURL());
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace system_private = api::system_private;
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool SystemPrivateGetIncognitoModeAvailabilityFunction::RunSync() {
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PrefService* prefs = GetProfile()->GetPrefs();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int value = prefs->GetInteger(prefs::kIncognitoModeAvailability);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value >= 0 &&
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value < static_cast<int>(arraysize(kIncognitoModeAvailabilityStrings)));
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SetResult(new base::StringValue(kIncognitoModeAvailabilityStrings[value]));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool SystemPrivateGetUpdateStatusFunction::RunSync() {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string state;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double download_progress = 0;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // With UpdateEngineClient, we can provide more detailed information about
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // system updates on ChromeOS.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const chromeos::UpdateEngineClient::Status status =
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()->
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetLastStatus();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |download_progress| is set to 1 after download finishes
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (i.e. verify, finalize and need-reboot phase) to indicate the progress
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // even though |status.download_progress| is 0 in these phases.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (status.status) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chromeos::UpdateEngineClient::UPDATE_STATUS_ERROR:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = kNotAvailableState;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chromeos::UpdateEngineClient::UPDATE_STATUS_IDLE:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = kNotAvailableState;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chromeos::UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = kNotAvailableState;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE:
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = kUpdatingState;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chromeos::UpdateEngineClient::UPDATE_STATUS_DOWNLOADING:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = kUpdatingState;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_progress = status.download_progress;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chromeos::UpdateEngineClient::UPDATE_STATUS_VERIFYING:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = kUpdatingState;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_progress = 1;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chromeos::UpdateEngineClient::UPDATE_STATUS_FINALIZING:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = kUpdatingState;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_progress = 1;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT:
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = kNeedRestartState;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_progress = 1;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chromeos::UpdateEngineClient::UPDATE_STATUS_REPORTING_ERROR_EVENT:
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case chromeos::UpdateEngineClient::UPDATE_STATUS_ATTEMPTING_ROLLBACK:
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = kNotAvailableState;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (UpgradeDetector::GetInstance()->notify_upgrade()) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state = kNeedRestartState;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_progress = 1;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state = kNotAvailableState;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue* dict = new base::DictionaryValue();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(kStateKey, state);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetDouble(kDownloadProgressKey, download_progress);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetResult(dict);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool SystemPrivateGetApiKeyFunction::RunSync() {
1380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  SetResult(new base::StringValue(google_apis::GetAPIKey()));
1390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return true;
1400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
1410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DispatchVolumeChangedEvent(double volume, bool is_volume_muted) {
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue* dict = new base::DictionaryValue();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetDouble(kVolumeKey, volume);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetBoolean(kIsVolumeMutedKey, is_volume_muted);
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DispatchEvent(system_private::OnVolumeChanged::kEventName, dict);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DispatchBrightnessChangedEvent(int brightness, bool user_initiated) {
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue* dict = new base::DictionaryValue();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetInteger(kBrightnessKey, brightness);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetBoolean(kUserInitiatedKey, user_initiated);
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DispatchEvent(system_private::OnBrightnessChanged::kEventName, dict);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DispatchScreenUnlockedEvent() {
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DispatchEvent(system_private::OnScreenUnlocked::kEventName, NULL);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DispatchWokeUpEvent() {
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DispatchEvent(system_private::OnWokeUp::kEventName, NULL);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
165