15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved. 25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be 35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file. 45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/webui/chromeos/set_time_ui.h" 65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ash/shell.h" 85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ash/system/tray/system_tray_delegate.h" 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ash/system/user/login_status.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/bind.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/bind_helpers.h" 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/build_time.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/values.h" 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/chromeos/settings/cros_settings.h" 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/chromeos/system/timezone_util.h" 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/profiles/profile.h" 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/common/url_constants.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h" 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chromeos/dbus/dbus_thread_manager.h" 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chromeos/dbus/system_clock_client.h" 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chromeos/settings/timezone_settings.h" 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/web_ui.h" 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/web_ui_data_source.h" 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/web_ui_message_handler.h" 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "grit/browser_resources.h" 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace chromeos { 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace { 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass SetTimeMessageHandler : public content::WebUIMessageHandler, 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public chromeos::SystemClockClient::Observer, 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public system::TimezoneSettings::Observer { 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SetTimeMessageHandler() { 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu system::TimezoneSettings::GetInstance()->AddObserver(this); 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu chromeos::DBusThreadManager::Get()->GetSystemClockClient()->AddObserver( 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu this); 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual ~SetTimeMessageHandler() { 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu system::TimezoneSettings::GetInstance()->RemoveObserver(this); 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu chromeos::DBusThreadManager::Get()->GetSystemClockClient()->RemoveObserver( 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu this); 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // WebUIMessageHandler: 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void RegisterMessages() OVERRIDE { 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_ui()->RegisterMessageCallback( 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "setTimeInSeconds", 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Bind(&SetTimeMessageHandler::OnSetTime, base::Unretained(this))); 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_ui()->RegisterMessageCallback( 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "setTimezone", 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Bind(&SetTimeMessageHandler::OnSetTimezone, 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Unretained(this))); 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // system::SystemClockClient::Observer: 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void SystemClockUpdated() OVERRIDE { 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_ui()->CallJavascriptFunction("settime.TimeSetter.updateTime"); 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // system::TimezoneSettings::Observer: 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void TimezoneChanged(const icu::TimeZone& timezone) OVERRIDE { 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue timezone_id( 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu system::TimezoneSettings::GetTimezoneID(timezone)); 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_ui()->CallJavascriptFunction("settime.TimeSetter.setTimezone", 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu timezone_id); 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Handler for Javascript call to set the system clock when the user sets a 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // new time. Expects the time as the number of seconds since the Unix 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // epoch, treated as a double. 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnSetTime(const base::ListValue* args) { 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu double seconds; 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!args->GetDouble(0, &seconds)) { 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NOTREACHED(); 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu chromeos::DBusThreadManager::Get()->GetSystemClockClient()->SetTime( 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static_cast<int64>(seconds)); 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Handler for Javascript call to change the system time zone when the user 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // selects a new time zone. Expects the time zone ID as a string, as it 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // appears in the time zone option values. 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnSetTimezone(const base::ListValue* args) { 905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::string timezone_id; 915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!args->GetString(0, &timezone_id)) { 925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NOTREACHED(); 935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CrosSettings::Get()->SetString(kSystemTimezone, timezone_id); 975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DISALLOW_COPY_AND_ASSIGN(SetTimeMessageHandler); 1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuSetTimeUI::SetTimeUI(content::WebUI* web_ui) : WebDialogUI(web_ui) { 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_ui->AddMessageHandler(new SetTimeMessageHandler()); 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Set up the chrome://set-time source. 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::WebUIDataSource* source = 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::WebUIDataSource::Create(chrome::kChromeUISetTimeHost); 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source->SetUseJsonJSFormatV2(); 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source->AddLocalizedString("setTimeTitle", IDS_SET_TIME_TITLE); 1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source->AddLocalizedString("prompt", IDS_SET_TIME_PROMPT); 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source->AddLocalizedString("doneButton", IDS_SET_TIME_BUTTON_CLOSE); 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source->AddLocalizedString("timezone", 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu IDS_OPTIONS_SETTINGS_TIMEZONE_DESCRIPTION); 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source->AddLocalizedString("dateLabel", IDS_SET_TIME_DATE_LABEL); 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source->AddLocalizedString("timeLabel", IDS_SET_TIME_TIME_LABEL); 1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::DictionaryValue values; 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu values.Set("timezoneList", chromeos::system::GetTimezoneList().release()); 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // If we are not logged in, we need to show the time zone dropdown. 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Otherwise, we can leave |currentTimezoneId| blank. 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::string current_timezone_id; 1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (ash::Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus() == 1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ash::user::LOGGED_IN_NONE) { 1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CrosSettings::Get()->GetString(kSystemTimezone, ¤t_timezone_id); 1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu values.SetString("currentTimezoneId", current_timezone_id); 1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu values.SetDouble("buildTime", base::GetBuildTime().ToJsTime()); 1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source->AddLocalizedStrings(values); 1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source->SetJsonPath("strings.js"); 1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source->AddResourcePath("set_time.css", IDR_SET_TIME_CSS); 1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source->AddResourcePath("set_time.js", IDR_SET_TIME_JS); 1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source->SetDefaultResource(IDR_SET_TIME_HTML); 1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source); 1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuSetTimeUI::~SetTimeUI() { 1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace chromeos 147