172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <string>
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/string_util.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros_settings.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/metrics/user_metrics.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_details.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_source.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickCoreChromeOSOptionsHandler::CoreChromeOSOptionsHandler()
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : handling_change_(false) {
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickValue* CoreChromeOSOptionsHandler::FetchPref(const std::string& pref_name) {
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!CrosSettings::IsCrosSettings(pref_name))
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return ::CoreOptionsHandler::FetchPref(pref_name);
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Value* pref_value = NULL;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrosSettings::Get()->Get(pref_name, &pref_value);
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return pref_value ? pref_value : Value::CreateNullValue();
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreChromeOSOptionsHandler::ObservePref(const std::string& pref_name) {
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!CrosSettings::IsCrosSettings(pref_name))
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return ::CoreOptionsHandler::ObservePref(pref_name);
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(xiyuan): Change this when CrosSettings supports observers.
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CrosSettings::Get()->AddSettingsObserver(pref_name.c_str(), this);
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreChromeOSOptionsHandler::SetPref(const std::string& pref_name,
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                         const Value* value,
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                         const std::string& metric) {
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!CrosSettings::IsCrosSettings(pref_name))
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return ::CoreOptionsHandler::SetPref(pref_name, value, metric);
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  handling_change_ = true;
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // CrosSettings takes ownership of its value so we need to copy it.
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Value* pref_value = value->DeepCopy();
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  CrosSettings::Get()->Set(pref_name, pref_value);
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  handling_change_ = false;
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ProcessUserMetric(value, metric);
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreChromeOSOptionsHandler::StopObservingPref(const std::string& path) {
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Unregister this instance from observing prefs of chrome os settings.
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (CrosSettings::IsCrosSettings(path))
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    CrosSettings::Get()->RemoveSettingsObserver(path.c_str(), this);
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  else  // Call base class to handle regular preferences.
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ::CoreOptionsHandler::StopObservingPref(path);
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreChromeOSOptionsHandler::Observe(NotificationType type,
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                         const NotificationSource& source,
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                         const NotificationDetails& details) {
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Ignore the notification if this instance had caused it.
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (handling_change_)
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (type == NotificationType::SYSTEM_SETTING_CHANGED) {
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    NotifySettingsChanged(Details<std::string>(details).ptr());
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ::CoreOptionsHandler::Observe(type, source, details);
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreChromeOSOptionsHandler::NotifySettingsChanged(
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string* setting_name) {
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(web_ui_);
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(CrosSettings::Get()->IsCrosSettings(*setting_name));
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Value* value = NULL;
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!CrosSettings::Get()->Get(*setting_name, &value)) {
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    NOTREACHED();
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (value)
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      delete value;
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (PreferenceCallbackMap::const_iterator iter =
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      pref_callback_map_.find(*setting_name);
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      iter != pref_callback_map_.end(); ++iter) {
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::wstring& callback_function = iter->second;
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ListValue result_value;
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    result_value.Append(Value::CreateStringValue(setting_name->c_str()));
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    result_value.Append(value->DeepCopy());
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    web_ui_->CallJavascriptFunction(WideToASCII(callback_function),
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    result_value);
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (value)
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    delete value;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
100