system_tray_delegate_chromeos.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 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) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/ash/system_tray_delegate_chromeos.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/ash_switches.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/desktop_background/desktop_background_controller.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/metrics/user_metrics_recorder.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/session_state_delegate.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/session_state_observer.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_delegate.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/bluetooth/bluetooth_observer.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/date/clock_observer.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/drive/drive_observer.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/ime/ime_observer.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/logout_button/logout_button_observer.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray_accessibility.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray_caps_lock.h" 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ash/system/user/login_status.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/user/update_observer.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/user/user_observer.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/volume_control_delegate.h" 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/wm/lock_state_controller.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 415e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h" 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/accessibility/accessibility_manager.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/accessibility/magnification_manager.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/bluetooth/bluetooth_pairing_dialog.h" 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/charger_replace/charger_replacement_dialog.h" 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/choose_mobile_network_dialog.h" 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/drive_integration_service.h" 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/job_list.h" 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/chromeos/enrollment_dialog_view.h" 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/events/system_key_event_listener.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_util.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h" 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/help_app_launcher.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/login_display_host.h" 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/login_display_host_impl.h" 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/login_wizard.h" 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/startup_utils.h" 638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/chromeos/login/supervised_user_manager.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user.h" 65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_adding_screen.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h" 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/options/network_config_view.h" 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/profiles/multiprofiles_intro_dialog.h" 71bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "chrome/browser/chromeos/settings/cros_settings.h" 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/sim_dialog_delegate.h" 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/drive/drive_service_interface.h" 74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/feedback/tracing_manager.h" 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/google/google_util.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/ash/multi_user/multi_user_util.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/volume_controller_chromeos.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/singleton_tabs.h" 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/tabs/tab_strip_model.h" 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/charger_replacement_handler.h" 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/mobile_setup_dialog.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/upgrade_detector.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/session_manager_client.h" 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/extension_ime_util.h" 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_manager.h" 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/xkeyboard.h" 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/login/login_state.h" 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_store.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/web_contents.h" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "device/bluetooth/bluetooth_adapter.h" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "device/bluetooth/bluetooth_adapter_factory.h" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "device/bluetooth/bluetooth_device.h" 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_strings.h" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/locale_settings.h" 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/base/escape.h" 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 113bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "ui/base/l10n/time_format.h" 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using drive::DriveIntegrationService; 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using drive::DriveIntegrationServiceFactory; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The minimum session length limit that can be set. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kSessionLengthLimitMinMs = 30 * 1000; // 30 seconds. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The maximum session length limit that can be set. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kSessionLengthLimitMaxMs = 24 * 60 * 60 * 1000; // 24 hours. 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kDisplaySettingsSubPageName[] = "display"; 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kDisplayOverscanSettingsSubPageName[] = "displayOverscan"; 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// The URL for the Google Drive settings page. 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char kDriveSettingsPageURL[] = "https://drive.google.com"; 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtractIMEInfo(const input_method::InputMethodDescriptor& ime, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const input_method::InputMethodUtil& util, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::IMEInfo* info) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->id = ime.id(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->name = util.GetInputMethodLongName(ime); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->medium_name = util.GetInputMethodMediumName(ime); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->short_name = util.GetInputMethodShortName(ime); 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) info->third_party = extension_ime_util::IsExtensionIME(ime.id()); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::NativeWindow GetNativeWindowByStatus(ash::user::LoginStatus login_status, 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool session_started) { 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int container_id = 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (!session_started || login_status == ash::user::LOGGED_IN_NONE || 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) login_status == ash::user::LOGGED_IN_LOCKED) ? 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::internal::kShellWindowId_LockSystemModalContainer : 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::internal::kShellWindowId_SystemModalContainer; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(), 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_id); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Converts drive::JobInfo to ash::DriveOperationStatus. 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// If the job is not of type that ash tray is interested, returns false. 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ConvertToDriveOperationStatus(const drive::JobInfo& info, 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::DriveOperationStatus* status) { 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (info.job_type == drive::TYPE_DOWNLOAD_FILE) { 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status->type = ash::DriveOperationStatus::OPERATION_DOWNLOAD; 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (info.job_type == drive::TYPE_UPLOAD_NEW_FILE || 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info.job_type == drive::TYPE_UPLOAD_EXISTING_FILE) { 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status->type = ash::DriveOperationStatus::OPERATION_UPLOAD; 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (info.state == drive::STATE_NONE) 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status->state = ash::DriveOperationStatus::OPERATION_NOT_STARTED; 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status->state = ash::DriveOperationStatus::OPERATION_IN_PROGRESS; 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status->id = info.job_id; 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status->file_path = info.file_path; 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status->progress = info.num_total_bytes == 0 ? 0.0 : 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<double>(info.num_completed_bytes) / 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<double>(info.num_total_bytes); 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Converts drive::JobInfo that has finished in |error| state 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to ash::DriveOperationStatus. 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// If the job is not of type that ash tray is interested, returns false. 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ConvertToFinishedDriveOperationStatus(const drive::JobInfo& info, 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::FileError error, 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::DriveOperationStatus* status) { 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!ConvertToDriveOperationStatus(info, status)) 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) status->state = (error == drive::FILE_ERROR_OK) 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ? ash::DriveOperationStatus::OPERATION_COMPLETED 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : ash::DriveOperationStatus::OPERATION_FAILED; 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Converts a list of drive::JobInfo to a list of ash::DriveOperationStatusList. 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ash::DriveOperationStatusList ConvertToDriveStatusList( 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<drive::JobInfo>& list) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::DriveOperationStatusList results; 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < list.size(); ++i) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::DriveOperationStatus status; 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (ConvertToDriveOperationStatus(list[i], &status)) 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) results.push_back(status); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return results; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BluetoothPowerFailure() { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sad): Show an error bubble? 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BluetoothSetDiscoveringError() { 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "BluetoothSetDiscovering failed."; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BluetoothDeviceConnectError( 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device::BluetoothDevice::ConnectErrorCode error_code) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sad): Do something? 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Shows the settings sub page in the last active browser. If there is no such 2210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// browser, creates a new browser with the settings sub page. 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShowSettingsSubPageForAppropriateBrowser(const std::string& sub_page, 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* profile) { 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ScopedTabbedBrowserDisplayer displayer(profile, 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::HOST_DESKTOP_TYPE_ASH); 2260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) chrome::ShowSettingsSubPage(displayer.browser(), sub_page); 2270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 2280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void ShowNetworkSettingsPage(const std::string& service_path) { 2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string page = chrome::kInternetOptionsSubPage; 2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) page += "?servicePath=" + net::EscapeUrlEncodedData(service_path, true); 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RecordAction(base::UserMetricsAction("OpenInternetOptionsDialog")); 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShowSettingsSubPageForAppropriateBrowser( 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) page, ProfileManager::GetPrimaryUserProfile()); 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void OnAcceptMultiprofilesIntro(bool no_show_again) { 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs->SetBoolean(prefs::kMultiProfileNeverShowIntro, no_show_again); 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UserAddingScreen::Get()->Start(); 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SystemTrayDelegateChromeOS::SystemTrayDelegateChromeOS() 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : weak_ptr_factory_(this), 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_profile_(NULL), 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) clock_type_(base::GetHourClockType()), 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) search_key_mapped_to_(input_method::kSearchKey), 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) screen_locked_(false), 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) have_session_start_time_(false), 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) have_session_length_limit_(false), 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) volume_control_delegate_(new VolumeController()), 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device_settings_observer_(CrosSettings::Get()->AddSettingsObserver( 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kSystemUse24HourClock, 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&SystemTrayDelegateChromeOS::UpdateClockType, 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this)))) { 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Register notifications on construction so that events such as 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // PROFILE_CREATED do not get missed if they happen before Initialize(). 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_.reset(new content::NotificationRegistrar); 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_->Add(this, 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_UPGRADE_RECOMMENDED, 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::AllSources()); 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_->Add(this, 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED, 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::AllSources()); 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetUserLoginStatus() == ash::user::LOGGED_IN_NONE) { 26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registrar_->Add(this, 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_SESSION_STARTED, 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::AllSources()); 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_->Add(this, 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_PROFILE_CREATED, 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::AllSources()); 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_->Add(this, 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_PROFILE_DESTROYED, 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::AllSources()); 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_->Add( 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFIER, 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::AllSources()); 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_->Add( 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK, 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::AllSources()); 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_->Add( 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE, 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::AllSources()); 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_->Add( 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_VIRTUAL_KEYBOARD, 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::AllSources()); 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::Initialize() { 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DBusThreadManager::Get()->GetSessionManagerClient()->AddObserver(this); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodManager::Get()->AddObserver(this); 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateClockType(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (SystemKeyEventListener::GetInstance()) 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SystemKeyEventListener::GetInstance()->AddCapsLockObserver(this); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device::BluetoothAdapterFactory::GetAdapter( 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&SystemTrayDelegateChromeOS::InitializeOnAdapterReady, 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::Shell::GetInstance()->session_state_delegate()->AddSessionStateObserver( 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this); 31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (LoginState::IsInitialized()) 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoginState::Get()->AddObserver(this); 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::Shutdown() { 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device_settings_observer_.reset(); 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::InitializeOnAdapterReady( 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<device::BluetoothAdapter> adapter) { 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bluetooth_adapter_ = adapter; 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(bluetooth_adapter_.get()); 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bluetooth_adapter_->AddObserver(this); 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) local_state_registrar_.reset(new PrefChangeRegistrar); 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) local_state_registrar_->Init(g_browser_process->local_state()); 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateSessionStartTime(); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateSessionLengthLimit(); 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) local_state_registrar_->Add( 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kSessionStartTime, 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&SystemTrayDelegateChromeOS::UpdateSessionStartTime, 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) local_state_registrar_->Add( 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kSessionLengthLimit, 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&SystemTrayDelegateChromeOS::UpdateSessionLengthLimit, 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy::BrowserPolicyConnectorChromeOS* policy_connector = 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->platform_part()->browser_policy_connector_chromeos(); 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy::DeviceCloudPolicyManagerChromeOS* policy_manager = 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy_connector->GetDeviceCloudPolicyManager(); 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (policy_manager) 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy_manager->core()->store()->AddObserver(this); 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateEnterpriseDomain(); 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SystemTrayDelegateChromeOS::~SystemTrayDelegateChromeOS() { 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Unregister PrefChangeRegistrars. 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) local_state_registrar_.reset(); 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_.reset(); 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Unregister content notifications befure destroying any components. 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_.reset(); 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DBusThreadManager::Get()->GetSessionManagerClient()->RemoveObserver(this); 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodManager::Get()->RemoveObserver(this); 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (SystemKeyEventListener::GetInstance()) 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SystemKeyEventListener::GetInstance()->RemoveCapsLockObserver(this); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bluetooth_adapter_->RemoveObserver(this); 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::Shell::GetInstance() 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->session_state_delegate() 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->RemoveSessionStateObserver(this); 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoginState::Get()->RemoveObserver(this); 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Stop observing Drive operations. 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UnobserveDriveUpdates(); 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy::BrowserPolicyConnectorChromeOS* connector = 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->platform_part()->browser_policy_connector_chromeos(); 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy::DeviceCloudPolicyManagerChromeOS* policy_manager = 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) connector->GetDeviceCloudPolicyManager(); 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (policy_manager) 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy_manager->core()->store()->RemoveObserver(this); 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Overridden from ash::SystemTrayDelegate: 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::GetTrayVisibilityOnStartup() { 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // In case of OOBE / sign in screen tray will be shown later. 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return LoginState::Get()->IsUserLoggedIn(); 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ash::user::LoginStatus SystemTrayDelegateChromeOS::GetUserLoginStatus() const { 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // All non-logged in ChromeOS specific LOGGED_IN states map to the same 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Ash specific LOGGED_IN state. 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!LoginState::Get()->IsUserLoggedIn()) 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ash::user::LOGGED_IN_NONE; 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (screen_locked_) 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ash::user::LOGGED_IN_LOCKED; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoginState::LoggedInUserType user_type = 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoginState::Get()->GetLoggedInUserType(); 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (user_type) { 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case LoginState::LOGGED_IN_USER_NONE: 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ash::user::LOGGED_IN_NONE; 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case LoginState::LOGGED_IN_USER_REGULAR: 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ash::user::LOGGED_IN_USER; 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case LoginState::LOGGED_IN_USER_OWNER: 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ash::user::LOGGED_IN_OWNER; 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case LoginState::LOGGED_IN_USER_GUEST: 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ash::user::LOGGED_IN_GUEST; 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case LoginState::LOGGED_IN_USER_RETAIL_MODE: 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ash::user::LOGGED_IN_RETAIL_MODE; 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT: 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ash::user::LOGGED_IN_PUBLIC; 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case LoginState::LOGGED_IN_USER_LOCALLY_MANAGED: 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ash::user::LOGGED_IN_LOCALLY_MANAGED; 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case LoginState::LOGGED_IN_USER_KIOSK_APP: 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ash::user::LOGGED_IN_KIOSK_APP; 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ash::user::LOGGED_IN_NONE; 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 417d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::IsOobeCompleted() const { 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!base::SysInfo::IsRunningOnChromeOS() && 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoginState::Get()->IsUserLoggedIn()) 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return StartupUtils::IsOobeCompleted(); 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ChangeProfilePicture() { 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RecordAction( 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("OpenChangeProfilePictureDialog")); 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShowSettingsSubPageForAppropriateBrowser( 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::kChangeProfilePictureSubPage, 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileManager::GetActiveUserProfile()); 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const std::string SystemTrayDelegateChromeOS::GetEnterpriseDomain() const { 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return enterprise_domain_; 4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::string16 SystemTrayDelegateChromeOS::GetEnterpriseMessage() const { 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetEnterpriseDomain().empty()) 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::string16(); 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return l10n_util::GetStringFUTF16(IDS_DEVICE_OWNED_BY_NOTICE, 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(GetEnterpriseDomain())); 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const std::string SystemTrayDelegateChromeOS::GetLocallyManagedUserManager() 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const { 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetUserLoginStatus() != ash::user::LOGGED_IN_LOCALLY_MANAGED) 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return std::string(); 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return UserManager::Get()->GetSupervisedUserManager()->GetManagerDisplayEmail( 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chromeos::UserManager::Get()->GetActiveUser()->email()); 4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::string16 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SystemTrayDelegateChromeOS::GetLocallyManagedUserManagerName() const { 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetUserLoginStatus() != ash::user::LOGGED_IN_LOCALLY_MANAGED) 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::string16(); 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return UserManager::Get()->GetSupervisedUserManager()->GetManagerDisplayName( 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chromeos::UserManager::Get()->GetActiveUser()->email()); 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::string16 SystemTrayDelegateChromeOS::GetLocallyManagedUserMessage() 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const { 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetUserLoginStatus() != ash::user::LOGGED_IN_LOCALLY_MANAGED) 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::string16(); 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return l10n_util::GetStringFUTF16( 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_USER_IS_LOCALLY_MANAGED_BY_NOTICE, 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(GetLocallyManagedUserManager())); 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::SystemShouldUpgrade() const { 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return UpgradeDetector::GetInstance()->notify_upgrade(); 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::HourClockType SystemTrayDelegateChromeOS::GetHourClockType() const { 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return clock_type_; 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowSettings() { 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ScopedTabbedBrowserDisplayer displayer( 4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileManager::GetActiveUserProfile(), chrome::HOST_DESKTOP_TYPE_ASH); 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ShowSettings(displayer.browser()); 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::ShouldShowSettings() { 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return UserManager::Get()->GetCurrentUserFlow()->ShouldShowSettings(); 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowDateSettings() { 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RecordAction(base::UserMetricsAction("ShowDateOptions")); 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string sub_page = 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string(chrome::kSearchSubPage) + "#" + 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) l10n_util::GetStringUTF8(IDS_OPTIONS_SETTINGS_SECTION_TITLE_DATETIME); 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Everybody can change the time zone (even though it is a device setting). 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShowSettingsSubPageForAppropriateBrowser( 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sub_page, ProfileManager::GetActiveUserProfile()); 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowNetworkSettings( 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& service_path) { 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!LoginState::Get()->IsUserLoggedIn()) 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShowNetworkSettingsPage(service_path); 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowBluetoothSettings() { 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(sad): Make this work. 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowDisplaySettings() { 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RecordAction(base::UserMetricsAction("ShowDisplayOptions")); 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShowSettingsSubPageForAppropriateBrowser( 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kDisplaySettingsSubPageName, ProfileManager::GetActiveUserProfile()); 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowChromeSlow() { 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ScopedTabbedBrowserDisplayer displayer( 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileManager::GetPrimaryUserProfile(), chrome::HOST_DESKTOP_TYPE_ASH); 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ShowSlow(displayer.browser()); 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::ShouldShowDisplayNotification() { 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Packaged app is not counted as 'last active', so if a browser opening the 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // display settings is in background of a packaged app, it will return true. 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(mukai): fix this. 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Browser* active_browser = 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::FindLastActiveWithHostDesktopType(chrome::HOST_DESKTOP_TYPE_ASH); 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!active_browser) 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 528ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents* active_contents = 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) active_browser->tab_strip_model()->GetActiveWebContents(); 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!active_contents) 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL visible_url = active_contents->GetLastCommittedURL(); 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string display_settings_url = 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string(chrome::kChromeUISettingsURL) + kDisplaySettingsSubPageName; 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string display_overscan_url = std::string(chrome::kChromeUISettingsURL) + 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kDisplayOverscanSettingsSubPageName; 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (visible_url.spec() != display_settings_url) && 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (visible_url.spec() != display_overscan_url); 5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowDriveSettings() { 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(tengs): Open the drive-specific settings page once we put it in. 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // For now just show Google Drive main page. 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ScopedTabbedBrowserDisplayer displayer( 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileManager::GetActiveUserProfile(), chrome::HOST_DESKTOP_TYPE_ASH); 5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ShowSingletonTabOverwritingNTP( 5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) displayer.browser(), 5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::GetSingletonTabNavigateParams(displayer.browser(), 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL(kDriveSettingsPageURL))); 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowIMESettings() { 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RecordAction(base::UserMetricsAction("OpenLanguageOptionsDialog")); 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShowSettingsSubPageForAppropriateBrowser( 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::kLanguageOptionsSubPage, ProfileManager::GetActiveUserProfile()); 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowHelp() { 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ShowHelpForProfile(ProfileManager::GetActiveUserProfile(), 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::HOST_DESKTOP_TYPE_ASH, 5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::HELP_SOURCE_MENU); 5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowAccessibilityHelp() { 5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ScopedTabbedBrowserDisplayer displayer( 5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileManager::GetActiveUserProfile(), chrome::HOST_DESKTOP_TYPE_ASH); 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) accessibility::ShowAccessibilityHelp(displayer.browser()); 5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 571b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowAccessibilitySettings() { 5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RecordAction(base::UserMetricsAction("ShowAccessibilitySettings")); 5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string sub_page = std::string(chrome::kSearchSubPage) + "#" + 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) l10n_util::GetStringUTF8( 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_OPTIONS_SETTINGS_SECTION_TITLE_ACCESSIBILITY); 5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShowSettingsSubPageForAppropriateBrowser( 5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sub_page, ProfileManager::GetActiveUserProfile()); 5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowPublicAccountInfo() { 5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ScopedTabbedBrowserDisplayer displayer( 5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileManager::GetActiveUserProfile(), chrome::HOST_DESKTOP_TYPE_ASH); 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ShowPolicy(displayer.browser()); 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowLocallyManagedUserInfo() { 5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(antrim): find out what should we show in this case. 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // http://crbug.com/229762 5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowEnterpriseInfo() { 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::user::LoginStatus status = GetUserLoginStatus(); 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (status == ash::user::LOGGED_IN_NONE || 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) status == ash::user::LOGGED_IN_LOCKED) { 5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<chromeos::HelpAppLauncher> help_app( 5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new chromeos::HelpAppLauncher(GetNativeWindow())); 5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) help_app->ShowHelpTopic(chromeos::HelpAppLauncher::HELP_ENTERPRISE); 5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url(google_util::StringAppendGoogleLocaleParam( 6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::kLearnMoreEnterpriseURL)); 6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ScopedTabbedBrowserDisplayer displayer( 6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileManager::GetActiveUserProfile(), chrome::HOST_DESKTOP_TYPE_ASH); 6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ShowSingletonTab(displayer.browser(), url); 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowUserLogin() { 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::Shell* shell = ash::Shell::GetInstance(); 6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!shell->delegate()->IsMultiProfilesEnabled()) 6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only regular users could add other users to current session. 6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (UserManager::Get()->GetActiveUser()->GetType() != 6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) User::USER_TYPE_REGULAR) { 6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (static_cast<int>(UserManager::Get()->GetLoggedInUsers().size()) >= 6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shell->session_state_delegate()->GetMaximumNumberOfLoggedInUsers()) 6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Launch sign in screen to add another user to current session. 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (UserManager::Get()->GetUsersAdmittedForMultiProfile().size()) { 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Don't show dialog if any logged in user in multi-profiles session 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // dismissed it. 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool show_intro = true; 6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const UserList logged_in_users = UserManager::Get()->GetLoggedInUsers(); 6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (UserList::const_iterator it = logged_in_users.begin(); 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != logged_in_users.end(); 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++it) { 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) show_intro &= !multi_user_util::GetProfileFromUserID( 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) multi_user_util::GetUserIDFromEmail((*it)->email())) 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->GetPrefs() 6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->GetBoolean(prefs::kMultiProfileNeverShowIntro); 6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!show_intro) 6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (show_intro) { 6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Callback<void(bool)> on_accept = 6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&OnAcceptMultiprofilesIntro); 6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShowMultiprofilesIntroDialog(on_accept); 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UserAddingScreen::Get()->Start(); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::ShowSpringChargerReplacementDialog() { 6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ChargerReplacementDialog::ShouldShowDialog()) 6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChargerReplacementDialog* dialog = 6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new ChargerReplacementDialog(GetNativeWindow()); 6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dialog->Show(); 6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::IsSpringChargerReplacementDialogVisible() { 6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ChargerReplacementDialog::IsDialogVisible(); 6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::HasUserConfirmedSafeSpringCharger() { 6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ChargerReplacementHandler::GetChargerStatusPref() == 6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChargerReplacementHandler::CONFIRM_SAFE_CHARGER; 6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShutDown() { 6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::Shell::GetInstance()->lock_state_controller()->RequestShutdown(); 6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::SignOut() { 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::AttemptUserExit(); 6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::RequestLockScreen() { 6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(antrim) : additional logging for crbug/173178 6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LOG(WARNING) << "Requesting screen lock from AshSystemTrayDelegate"; 6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DBusThreadManager::Get()->GetSessionManagerClient()->RequestLockScreen(); 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::RequestRestartForUpdate() { 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We expect that UpdateEngine is in "Reboot for update" state now. 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NotifyAndTerminate(true /* fast path */); 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::GetAvailableBluetoothDevices( 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::BluetoothDeviceList* list) { 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device::BluetoothAdapter::DeviceList devices = 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bluetooth_adapter_->GetDevices(); 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < devices.size(); ++i) { 6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device::BluetoothDevice* device = devices[i]; 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::BluetoothDeviceInfo info; 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info.address = device->GetAddress(); 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info.display_name = device->GetName(); 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info.connected = device->IsConnected(); 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info.connecting = device->IsConnecting(); 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info.paired = device->IsPaired(); 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) list->push_back(info); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::BluetoothStartDiscovering() { 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bluetooth_adapter_->StartDiscovering( 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&base::DoNothing), base::Bind(&BluetoothSetDiscoveringError)); 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::BluetoothStopDiscovering() { 7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bluetooth_adapter_->StopDiscovering( 7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&base::DoNothing), base::Bind(&BluetoothSetDiscoveringError)); 7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ConnectToBluetoothDevice( 7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& address) { 7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device::BluetoothDevice* device = bluetooth_adapter_->GetDevice(address); 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!device || device->IsConnecting() || 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (device->IsConnected() && device->IsPaired())) { 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (device->IsPaired() && !device->IsConnectable()) 7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (device->IsPaired() || !device->IsPairable()) { 7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::Shell::GetInstance()->metrics()->RecordUserMetricsAction( 7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_BLUETOOTH_CONNECT_KNOWN_DEVICE); 7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device->Connect(NULL, 7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&base::DoNothing), 7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&BluetoothDeviceConnectError)); 7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { // Show paring dialog for the unpaired device. 7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::Shell::GetInstance()->metrics()->RecordUserMetricsAction( 7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_BLUETOOTH_CONNECT_UNKNOWN_DEVICE); 7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BluetoothPairingDialog* dialog = 7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new BluetoothPairingDialog(GetNativeWindow(), device); 7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The dialog deletes itself on close. 7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dialog->Show(); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::IsBluetoothDiscovering() { 7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return bluetooth_adapter_->IsDiscovering(); 7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::GetCurrentIME(ash::IMEInfo* info) { 7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodManager* manager = 7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodManager::Get(); 7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodUtil* util = manager->GetInputMethodUtil(); 7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodDescriptor ime = manager->GetCurrentInputMethod(); 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtractIMEInfo(ime, *util, info); 7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info->selected = true; 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::GetAvailableIMEList(ash::IMEInfoList* list) { 7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodManager* manager = 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodManager::Get(); 7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodUtil* util = manager->GetInputMethodUtil(); 7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<input_method::InputMethodDescriptors> ime_descriptors( 7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager->GetActiveInputMethods()); 7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string current = manager->GetCurrentInputMethod().id(); 7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < ime_descriptors->size(); i++) { 7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodDescriptor& ime = ime_descriptors->at(i); 7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::IMEInfo info; 7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtractIMEInfo(ime, *util, &info); 7625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info.selected = ime.id() == current; 7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) list->push_back(info); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::GetCurrentIMEProperties( 7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::IMEPropertyInfoList* list) { 7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodManager* manager = 7705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodManager::Get(); 7715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodPropertyList properties = 7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager->GetCurrentInputMethodProperties(); 7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < properties.size(); ++i) { 7745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::IMEPropertyInfo property; 7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) property.key = properties[i].key; 7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) property.name = base::UTF8ToUTF16(properties[i].label); 7775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) property.selected = properties[i].is_selection_item_checked; 7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) list->push_back(property); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::SwitchIME(const std::string& ime_id) { 7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodManager::Get()->ChangeInputMethod(ime_id); 7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ActivateIMEProperty(const std::string& key) { 7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodManager::Get()->ActivateInputMethodProperty(key); 7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::CancelDriveOperation(int32 operation_id) { 7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DriveIntegrationService* integration_service = FindDriveIntegrationService(); 7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!integration_service) 7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) integration_service->job_list()->CancelJob(operation_id); 7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::GetDriveOperationStatusList( 7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::DriveOperationStatusList* list) { 8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DriveIntegrationService* integration_service = FindDriveIntegrationService(); 8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!integration_service) 8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *list = ConvertToDriveStatusList( 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) integration_service->job_list()->GetJobInfoList()); 8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowNetworkConfigure( 8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& network_id, 8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::NativeWindow parent_window) { 8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NetworkConfigView::Show(network_id, parent_window); 8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::EnrollNetwork( 8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& network_id, 8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::NativeWindow parent_window) { 8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return enrollment::CreateDialog(network_id, parent_window); 8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ManageBluetoothDevices() { 8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RecordAction(base::UserMetricsAction("ShowBluetoothSettingsPage")); 8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string sub_page = 8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string(chrome::kSearchSubPage) + "#" + 8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) l10n_util::GetStringUTF8(IDS_OPTIONS_SETTINGS_SECTION_TITLE_BLUETOOTH); 8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShowSettingsSubPageForAppropriateBrowser( 8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sub_page, ProfileManager::GetPrimaryUserProfile()); 8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ToggleBluetooth() { 8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bluetooth_adapter_->SetPowered(!bluetooth_adapter_->IsPowered(), 8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&base::DoNothing), 8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&BluetoothPowerFailure)); 8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowMobileSimDialog() { 8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimDialogDelegate::ShowDialog(GetNativeWindow(), 8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimDialogDelegate::SIM_DIALOG_UNLOCK); 8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 83990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowMobileSetupDialog( 8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& service_path) { 8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MobileSetupDialog::Show(service_path); 8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 844ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ShowOtherNetworkDialog( 8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& type) { 8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (type == shill::kTypeCellular) { 8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChooseMobileNetworkDialog::ShowDialog(GetNativeWindow()); 8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NetworkConfigView::ShowForType(type, GetNativeWindow()); 8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::GetBluetoothAvailable() { 8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return bluetooth_adapter_->IsPresent(); 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::GetBluetoothEnabled() { 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return bluetooth_adapter_->IsPowered(); 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ChangeProxySettings() { 8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(GetUserLoginStatus() == ash::user::LOGGED_IN_NONE); 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoginDisplayHostImpl::default_host()->OpenProxySettings(); 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ash::VolumeControlDelegate* 8685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SystemTrayDelegateChromeOS::GetVolumeControlDelegate() const { 8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return volume_control_delegate_.get(); 8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::SetVolumeControlDelegate( 8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<ash::VolumeControlDelegate> delegate) { 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) volume_control_delegate_.swap(delegate); 8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::GetSessionStartTime( 8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks* session_start_time) { 8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *session_start_time = session_start_time_; 8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return have_session_start_time_; 8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::GetSessionLengthLimit( 8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta* session_length_limit) { 8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *session_length_limit = session_length_limit_; 8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return have_session_length_limit_; 8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int SystemTrayDelegateChromeOS::GetSystemTrayMenuWidth() { 8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return l10n_util::GetLocalizedContentsWidthInPixels( 8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_SYSTEM_TRAY_MENU_BUBBLE_WIDTH_PIXELS); 8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ActiveUserWasChanged() { 8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyUserUpdate(); 8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ash::SystemTray* SystemTrayDelegateChromeOS::GetPrimarySystemTray() { 8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ash::Shell::GetInstance()->GetPrimarySystemTray(); 9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ash::SystemTrayNotifier* SystemTrayDelegateChromeOS::GetSystemTrayNotifier() { 9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ash::Shell::GetInstance()->system_tray_notifier(); 9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::SetProfile(Profile* profile) { 9075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Stop observing the current |user_profile_| on Drive integration status. 9085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UnobserveDriveUpdates(); 9095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_profile_ = profile; 9115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Restart observation, now for the newly set |profile|. 9135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ObserveDriveUpdates(); 9145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_.reset(new PrefChangeRegistrar); 9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_->Init(prefs); 9185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_->Add( 9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kUse24HourClock, 9205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&SystemTrayDelegateChromeOS::UpdateClockType, 9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 9225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_->Add( 9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kLanguageRemapSearchKeyTo, 9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&SystemTrayDelegateChromeOS::OnLanguageRemapSearchKeyToChanged, 9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_->Add( 9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kShowLogoutButtonInTray, 9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&SystemTrayDelegateChromeOS::UpdateShowLogoutButtonInTray, 9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_->Add( 9315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kLogoutDialogDurationMs, 9325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&SystemTrayDelegateChromeOS::UpdateLogoutDialogDuration, 9335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 9345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_->Add( 9355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kLargeCursorEnabled, 9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&SystemTrayDelegateChromeOS::OnAccessibilityModeChanged, 9375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this), 9385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::A11Y_NOTIFICATION_NONE)); 9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_->Add( 9405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kAutoclickEnabled, 9415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&SystemTrayDelegateChromeOS::OnAccessibilityModeChanged, 9425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this), 9435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::A11Y_NOTIFICATION_NONE)); 9445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_->Add( 9455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kShouldAlwaysShowAccessibilityMenu, 9465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&SystemTrayDelegateChromeOS::OnAccessibilityModeChanged, 9475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this), 9485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::A11Y_NOTIFICATION_NONE)); 9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_->Add( 9505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kPerformanceTracingEnabled, 9515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&SystemTrayDelegateChromeOS::UpdatePerformanceTracing, 9525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 9535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateClockType(); 9555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateShowLogoutButtonInTray(); 9565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateLogoutDialogDuration(); 9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdatePerformanceTracing(); 9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) search_key_mapped_to_ = 9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile->GetPrefs()->GetInteger(prefs::kLanguageRemapSearchKeyTo); 9605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 96190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::UnsetProfile(Profile* profile) { 9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (profile != user_profile_) 9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_.reset(); 9665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ObserveDriveUpdates() { 9705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DriveIntegrationService* integration_service = FindDriveIntegrationService(); 9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (integration_service) 9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) integration_service->job_list()->AddObserver(this); 9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::UnobserveDriveUpdates() { 9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DriveIntegrationService* integration_service = FindDriveIntegrationService(); 9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (integration_service) 9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) integration_service->job_list()->RemoveObserver(this); 9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 980bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::GetShouldUse24HourClockForTesting() const { 9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ShouldUse24HourClock(); 9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SystemTrayDelegateChromeOS::ShouldUse24HourClock() const { 9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // On login screen and in guest mode owner default is used for 9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // kUse24HourClock preference. 9885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ash::user::LoginStatus status = GetUserLoginStatus(); 9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CrosSettings* const cros_settings = CrosSettings::Get(); 9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool system_use_24_hour_clock = true; 9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const bool system_value_found = cros_settings->GetBoolean( 9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kSystemUse24HourClock, &system_use_24_hour_clock); 9935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if ((status == ash::user::LOGGED_IN_NONE) || !user_pref_registrar_) 9955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (system_value_found 9965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ? system_use_24_hour_clock 9975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : (base::GetHourClockType() == base::k24HourClock)); 9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const PrefService::Preference* user_pref = 10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_->prefs()->FindPreference(prefs::kUse24HourClock); 10015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (status == ash::user::LOGGED_IN_GUEST && user_pref->IsDefaultValue()) 10025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (system_value_found 10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ? system_use_24_hour_clock 10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : (base::GetHourClockType() == base::k24HourClock)); 10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool use_24_hour_clock = true; 10075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref->GetValue()->GetAsBoolean(&use_24_hour_clock); 10085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return use_24_hour_clock; 10095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::UpdateClockType() { 10125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const bool use_24_hour_clock = ShouldUse24HourClock(); 10135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) clock_type_ = use_24_hour_clock ? base::k24HourClock : base::k12HourClock; 10145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyDateFormatChanged(); 10155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This also works for enterprise-managed devices because they never have 10165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // local owner. 10175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (chromeos::UserManager::Get()->IsCurrentUserOwner()) 10185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CrosSettings::Get()->SetBoolean(kSystemUse24HourClock, use_24_hour_clock); 10195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::UpdateShowLogoutButtonInTray() { 10225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyShowLoginButtonChanged( 10235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_->prefs()->GetBoolean( 10245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kShowLogoutButtonInTray)); 10255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::UpdateLogoutDialogDuration() { 10285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int duration_ms = 10295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_pref_registrar_->prefs()->GetInteger(prefs::kLogoutDialogDurationMs); 10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyLogoutDialogDurationChanged( 10315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta::FromMilliseconds(duration_ms)); 10325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 103358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::UpdateSessionStartTime() { 10355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const PrefService* local_state = local_state_registrar_->prefs(); 10365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (local_state->HasPrefPath(prefs::kSessionStartTime)) { 10375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) have_session_start_time_ = true; 10385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) session_start_time_ = base::TimeTicks::FromInternalValue( 10395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) local_state->GetInt64(prefs::kSessionStartTime)); 10405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 10415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) have_session_start_time_ = false; 10425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) session_start_time_ = base::TimeTicks(); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifySessionStartTimeChanged(); 10455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::UpdateSessionLengthLimit() { 10485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const PrefService* local_state = local_state_registrar_->prefs(); 10495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (local_state->HasPrefPath(prefs::kSessionLengthLimit)) { 10505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) have_session_length_limit_ = true; 10515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) session_length_limit_ = base::TimeDelta::FromMilliseconds( 10525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::min(std::max(local_state->GetInteger(prefs::kSessionLengthLimit), 10535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kSessionLengthLimitMinMs), 10545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kSessionLengthLimitMaxMs)); 10555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 10565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) have_session_length_limit_ = false; 10575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) session_length_limit_ = base::TimeDelta(); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifySessionLengthLimitChanged(); 10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// LoginState::Observer overrides. 10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::LoggedInStateChanged() { 10645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // It apparently sometimes takes a while after login before the current user 10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // is recognized as the owner. Make sure that the system-wide clock setting 10665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // is updated when the recognition eventually happens 10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // (http://crbug.com/278601). 10685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 10695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note that it isn't safe to blindly call UpdateClockType() from this 10705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // method, as LoggedInStateChanged() is also called before the logged-in 10715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // user's profile has actually been loaded (http://crbug.com/317745). The 10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // system tray's time format is updated at login via SetProfile(). 10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (chromeos::UserManager::Get()->IsCurrentUserOwner()) { 10745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CrosSettings::Get()->SetBoolean(kSystemUse24HourClock, 10755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShouldUse24HourClock()); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Overridden from SessionManagerClient::Observer. 10805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ScreenIsLocked() { 10815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) screen_locked_ = true; 10825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::Shell::GetInstance()->UpdateAfterLoginStatusChange(GetUserLoginStatus()); 10835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::ScreenIsUnlocked() { 10865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) screen_locked_ = false; 10875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::Shell::GetInstance()->UpdateAfterLoginStatusChange(GetUserLoginStatus()); 10885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::NativeWindow SystemTrayDelegateChromeOS::GetNativeWindow() const { 10915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool session_started = ash::Shell::GetInstance() 10925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->session_state_delegate() 10935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->IsActiveUserSessionStarted(); 10945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetNativeWindowByStatus(GetUserLoginStatus(), session_started); 10955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// content::NotificationObserver implementation. 10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::Observe( 10995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int type, 11005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const content::NotificationSource& source, 11015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const content::NotificationDetails& details) { 11025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (type) { 11035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case chrome::NOTIFICATION_UPGRADE_RECOMMENDED: { 11045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpgradeDetector* detector = 11055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Source<UpgradeDetector>(source).ptr(); 11065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UpdateObserver::UpdateSeverity severity = 11075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UpdateObserver::UPDATE_NORMAL; 11085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (detector->upgrade_notification_stage()) { 11095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case UpgradeDetector::UPGRADE_ANNOYANCE_SEVERE: 11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) severity = ash::UpdateObserver::UPDATE_SEVERE_RED; 11115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case UpgradeDetector::UPGRADE_ANNOYANCE_HIGH: 11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) severity = ash::UpdateObserver::UPDATE_HIGH_ORANGE; 11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case UpgradeDetector::UPGRADE_ANNOYANCE_ELEVATED: 11185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) severity = ash::UpdateObserver::UPDATE_LOW_GREEN; 11195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case UpgradeDetector::UPGRADE_ANNOYANCE_LOW: 11225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 11235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) severity = ash::UpdateObserver::UPDATE_NORMAL; 11245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyUpdateRecommended(severity); 11275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED: { 11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This notification is also sent on login screen when user avatar 11315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // is loaded from file. 11325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetUserLoginStatus() != ash::user::LOGGED_IN_NONE) { 11335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyUserUpdate(); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case chrome::NOTIFICATION_PROFILE_CREATED: { 11385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetProfile(content::Source<Profile>(source).ptr()); 11395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_->Remove(this, 11405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_PROFILE_CREATED, 11415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::AllSources()); 11425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case chrome::NOTIFICATION_PROFILE_DESTROYED: { 11455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (UnsetProfile(content::Source<Profile>(source).ptr())) { 114690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registrar_->Remove(this, 11475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_PROFILE_DESTROYED, 114890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::NotificationService::AllSources()); 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case chrome::NOTIFICATION_SESSION_STARTED: { 11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::Shell::GetInstance()->UpdateAfterLoginStatusChange( 11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetUserLoginStatus()); 11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetProfile(ProfileManager::GetActiveUserProfile()); 11565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK: 11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE: 11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFIER: 11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_VIRTUAL_KEYBOARD: { 11625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccessibilityStatusEventDetails* accessibility_status = 11635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Details<AccessibilityStatusEventDetails>(details).ptr(); 11645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAccessibilityModeChanged(accessibility_status->notify); 11655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 11675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::OnLanguageRemapSearchKeyToChanged() { 11735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) search_key_mapped_to_ = user_pref_registrar_->prefs()->GetInteger( 11745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kLanguageRemapSearchKeyTo); 11755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::OnAccessibilityModeChanged( 11785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::AccessibilityNotificationVisibility notify) { 11795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyAccessibilityModeChanged(notify); 11805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::UpdatePerformanceTracing() { 11835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!user_pref_registrar_) 11845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 11855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool value = user_pref_registrar_->prefs()->GetBoolean( 11865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kPerformanceTracingEnabled); 11875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyTracingModeChanged(value); 11885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Overridden from InputMethodManager::Observer. 11915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::InputMethodChanged( 11925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodManager* manager, 11935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool show_message) { 11945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |show_message| in ash means the message_center notifications 11955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // which should not be shown unless kDisableIMEModeIndicator is 11965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // on, since the mode indicator already notifies the user. 11975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!CommandLine::ForCurrentProcess()->HasSwitch( 11985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switches::kDisableIMEModeIndicator)) { 11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) show_message = false; 12005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyRefreshIME(show_message); 12025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::InputMethodPropertyChanged( 12055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_method::InputMethodManager* manager) { 12065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyRefreshIME(false); 12075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// drive::JobListObserver overrides. 12105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::OnJobAdded(const drive::JobInfo& job_info) { 12115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnJobUpdated(job_info); 12125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::OnJobDone(const drive::JobInfo& job_info, 12155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drive::FileError error) { 12165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::DriveOperationStatus status; 12175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ConvertToFinishedDriveOperationStatus(job_info, error, &status)) 12185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyDriveJobUpdated(status); 12195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::OnJobUpdated(const drive::JobInfo& job_info) { 12225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::DriveOperationStatus status; 12235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ConvertToDriveOperationStatus(job_info, &status)) 12245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyDriveJobUpdated(status); 12255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DriveIntegrationService* 12285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SystemTrayDelegateChromeOS::FindDriveIntegrationService() { 12295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return user_profile_ 12305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ? DriveIntegrationServiceFactory::FindForProfile(user_profile_) 12315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : NULL; 12325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Overridden from BluetoothAdapter::Observer. 12355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::AdapterPresentChanged( 12365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device::BluetoothAdapter* adapter, 12375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool present) { 12385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyRefreshBluetooth(); 12395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::AdapterPoweredChanged( 12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device::BluetoothAdapter* adapter, 12435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool powered) { 12445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyRefreshBluetooth(); 12455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::AdapterDiscoveringChanged( 12485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device::BluetoothAdapter* adapter, 12495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool discovering) { 12505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyBluetoothDiscoveringChanged(); 12515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::DeviceAdded(device::BluetoothAdapter* adapter, 12545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device::BluetoothDevice* device) { 12555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyRefreshBluetooth(); 12565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::DeviceChanged( 12595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device::BluetoothAdapter* adapter, 12605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device::BluetoothDevice* device) { 12615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyRefreshBluetooth(); 12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::DeviceRemoved( 12655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device::BluetoothAdapter* adapter, 12665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device::BluetoothDevice* device) { 12675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyRefreshBluetooth(); 12685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Overridden from SystemKeyEventListener::CapsLockObserver. 12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::OnCapsLockChange(bool enabled) { 12725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool search_mapped_to_caps_lock = false; 12735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!base::SysInfo::IsRunningOnChromeOS() || 12745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) search_key_mapped_to_ == input_method::kCapsLockKey) 12755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) search_mapped_to_caps_lock = true; 12765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyCapsLockChanged(enabled, 12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) search_mapped_to_caps_lock); 12785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 12805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::UpdateEnterpriseDomain() { 12815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy::BrowserPolicyConnectorChromeOS* connector = 12825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->platform_part()->browser_policy_connector_chromeos(); 12835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string enterprise_domain = connector->GetEnterpriseDomain(); 12845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (enterprise_domain_ != enterprise_domain) { 12855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enterprise_domain_ = enterprise_domain; 12865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyEnterpriseDomainChanged(); 12874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 12885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Overridden from CloudPolicyStore::Observer 12915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::OnStoreLoaded( 12925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy::CloudPolicyStore* store) { 12935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateEnterpriseDomain(); 12945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 12965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::OnStoreError(policy::CloudPolicyStore* store) { 12975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateEnterpriseDomain(); 12985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Overridden from ash::SessionStateObserver 13015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemTrayDelegateChromeOS::UserAddedToSession( 13025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& user_id) { 13035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSystemTrayNotifier()->NotifyUserAddedToSession(); 13045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ash::SystemTrayDelegate* CreateSystemTrayDelegate() { 13075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new SystemTrayDelegateChromeOS(); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 1311