system_tray_delegate_linux.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/ash/system_tray_delegate_linux.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <string>
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/shell.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/shell_delegate.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/volume_control_delegate.h"
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/time/time.h"
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/chrome_notification_types.h"
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h"
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/upgrade_detector.h"
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/browser/notification_observer.h"
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/browser/notification_service.h"
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "grit/locale_settings.h"
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace {
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class SystemTrayDelegateLinux : public ash::SystemTrayDelegate,
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                public content::NotificationObserver {
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SystemTrayDelegateLinux()
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      : clock_type_(base::GetHourClockType()) {
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Register notifications on construction so that events such as
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // PROFILE_CREATED do not get missed if they happen before Initialize().
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    registrar_.reset(new content::NotificationRegistrar);
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    registrar_->Add(this,
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    chrome::NOTIFICATION_UPGRADE_RECOMMENDED,
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    content::NotificationService::AllSources());
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~SystemTrayDelegateLinux() {
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    registrar_.reset();
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Overridden from ash::SystemTrayDelegate:
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void Initialize() OVERRIDE {
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    UpdateClockType();
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void Shutdown() OVERRIDE {
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool GetTrayVisibilityOnStartup() OVERRIDE {
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return true;
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ash::user::LoginStatus GetUserLoginStatus() const OVERRIDE {
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return ash::user::LOGGED_IN_OWNER;
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ChangeProfilePicture() OVERRIDE {
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual const std::string GetEnterpriseDomain() const OVERRIDE {
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return std::string();
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual const base::string16 GetEnterpriseMessage() const OVERRIDE {
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return base::string16();
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual const std::string GetLocallyManagedUserManager() const OVERRIDE {
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return std::string();
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual const base::string16 GetLocallyManagedUserManagerName() const
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        OVERRIDE {
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return base::string16();
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual const base::string16 GetLocallyManagedUserMessage() const OVERRIDE {
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return base::string16();
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool SystemShouldUpgrade() const OVERRIDE {
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return UpgradeDetector::GetInstance()->notify_upgrade();
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual base::HourClockType GetHourClockType() const OVERRIDE {
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return clock_type_;
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowSettings() OVERRIDE {
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool ShouldShowSettings() OVERRIDE {
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return true;
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowDateSettings() OVERRIDE {
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowSetTimeDialog() OVERRIDE {
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowNetworkSettings(const std::string& service_path) OVERRIDE {
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowBluetoothSettings() OVERRIDE {
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowDisplaySettings() OVERRIDE {
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowChromeSlow() OVERRIDE {
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    chrome::ScopedTabbedBrowserDisplayer displayer(
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        ProfileManager::GetPrimaryUserProfile(), chrome::HOST_DESKTOP_TYPE_ASH);
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    chrome::ShowSlow(displayer.browser());
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool ShouldShowDisplayNotification() OVERRIDE {
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowDriveSettings() OVERRIDE {
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowIMESettings() OVERRIDE {
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowHelp() OVERRIDE {
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    chrome::ShowHelpForProfile(
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        ProfileManager::GetLastUsedProfile(),
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        chrome::HOST_DESKTOP_TYPE_ASH,
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        chrome::HELP_SOURCE_MENU);
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowAccessibilityHelp() OVERRIDE {
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowAccessibilitySettings() OVERRIDE {
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowPublicAccountInfo() OVERRIDE {
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowLocallyManagedUserInfo() OVERRIDE {
15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowEnterpriseInfo() OVERRIDE {
15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowUserLogin() OVERRIDE {
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool ShowSpringChargerReplacementDialog() OVERRIDE {
15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool IsSpringChargerReplacementDialogVisible() OVERRIDE {
16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool HasUserConfirmedSafeSpringCharger() OVERRIDE {
16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShutDown() OVERRIDE {
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void SignOut() OVERRIDE {
17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void RequestLockScreen() OVERRIDE {
17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void RequestRestartForUpdate() OVERRIDE {
18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    chrome::AttemptRestart();
18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void GetAvailableBluetoothDevices(
18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ash::BluetoothDeviceList* list) OVERRIDE {
18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void BluetoothStartDiscovering() OVERRIDE {
18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void BluetoothStopDiscovering() OVERRIDE {
19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ConnectToBluetoothDevice(const std::string& address) OVERRIDE {
19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool IsBluetoothDiscovering() OVERRIDE {
19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void GetCurrentIME(ash::IMEInfo* info) OVERRIDE {
20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void GetAvailableIMEList(ash::IMEInfoList* list) OVERRIDE {
20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void GetCurrentIMEProperties(
20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ash::IMEPropertyInfoList* list) OVERRIDE {
20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void SwitchIME(const std::string& ime_id) OVERRIDE {
21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ActivateIMEProperty(const std::string& key) OVERRIDE {
21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void CancelDriveOperation(int32 operation_id) OVERRIDE {
21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
21946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void GetDriveOperationStatusList(
22046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ash::DriveOperationStatusList* list) OVERRIDE {
22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
22346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowNetworkConfigure(const std::string& network_id,
22446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                    gfx::NativeWindow parent_window) OVERRIDE {
22546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool EnrollNetwork(const std::string& network_id,
22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             gfx::NativeWindow parent_window) OVERRIDE {
22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return true;
23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ManageBluetoothDevices() OVERRIDE {
23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ToggleBluetooth() OVERRIDE {
23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowMobileSimDialog() OVERRIDE {
23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowMobileSetupDialog(const std::string& service_path) OVERRIDE {
24246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
24346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ShowOtherNetworkDialog(const std::string& type) OVERRIDE {
24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool GetBluetoothAvailable() OVERRIDE {
24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool GetBluetoothEnabled() OVERRIDE {
25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool GetBluetoothDiscovering() OVERRIDE {
25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
25946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ChangeProxySettings() OVERRIDE {
26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ash::VolumeControlDelegate*
26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GetVolumeControlDelegate() const OVERRIDE {
26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return NULL;
26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void SetVolumeControlDelegate(
26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      scoped_ptr<ash::VolumeControlDelegate> delegate) OVERRIDE {
26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool GetSessionStartTime(
27246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::TimeTicks* session_start_time) OVERRIDE {
27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool GetSessionLengthLimit(
27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::TimeDelta* session_length_limit) OVERRIDE {
27846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
28046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
28146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual int GetSystemTrayMenuWidth() OVERRIDE {
28246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return l10n_util::GetLocalizedContentsWidthInPixels(
28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        IDS_SYSTEM_TRAY_MENU_BUBBLE_WIDTH_PIXELS);
28446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
28546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
28646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ActiveUserWasChanged() OVERRIDE {
28746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
28846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
28946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool IsNetworkBehindCaptivePortal(
29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& service_path) const OVERRIDE {
29146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
29246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
29346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
29446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool IsSearchKeyMappedToCapsLock() OVERRIDE {
29546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
29646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
29846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ash::tray::UserAccountsDelegate* GetUserAccountsDelegate(
29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& user_id) OVERRIDE {
30046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return NULL;
30146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
30246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
30346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
30446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ash::SystemTrayNotifier* GetSystemTrayNotifier() {
30546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return ash::Shell::GetInstance()->system_tray_notifier();
30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
30846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void UpdateClockType() {
30946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    clock_type_ = (base::GetHourClockType() == base::k24HourClock) ?
31046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        base::k24HourClock : base::k12HourClock;
31146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    GetSystemTrayNotifier()->NotifyDateFormatChanged();
31246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
31346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
31446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // content::NotificationObserver implementation.
31546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void Observe(int type,
31646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       const content::NotificationSource& source,
31746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
31846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (type == chrome::NOTIFICATION_UPGRADE_RECOMMENDED) {
31946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        UpgradeDetector* detector =
32046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            content::Source<UpgradeDetector>(source).ptr();
32146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ash::UpdateObserver::UpdateSeverity severity =
32246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          ash::UpdateObserver::UPDATE_NORMAL;
32346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      switch (detector->upgrade_notification_stage()) {
32446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        case UpgradeDetector::UPGRADE_ANNOYANCE_CRITICAL:
32546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        case UpgradeDetector::UPGRADE_ANNOYANCE_SEVERE:
32646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          severity = ash::UpdateObserver::UPDATE_SEVERE_RED;
32746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          break;
32846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        case UpgradeDetector::UPGRADE_ANNOYANCE_HIGH:
32946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          severity = ash::UpdateObserver::UPDATE_HIGH_ORANGE;
33046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          break;
33146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        case UpgradeDetector::UPGRADE_ANNOYANCE_ELEVATED:
33246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          severity = ash::UpdateObserver::UPDATE_LOW_GREEN;
33346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          break;
33446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        case UpgradeDetector::UPGRADE_ANNOYANCE_LOW:
33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        case UpgradeDetector::UPGRADE_ANNOYANCE_NONE:
33646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          severity = ash::UpdateObserver::UPDATE_NORMAL;
33746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          break;
33846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      }
33946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetSystemTrayNotifier()->NotifyUpdateRecommended(severity);
34046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    } else {
34146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      NOTREACHED();
34246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
34346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
34446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
34546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<content::NotificationRegistrar> registrar_;
34646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::HourClockType clock_type_;
34746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
34846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SystemTrayDelegateLinux);
34946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
35046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
35146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace
35246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
35346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
35446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ash::SystemTrayDelegate* CreateLinuxSystemTrayDelegate() {
35546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return new SystemTrayDelegateLinux();
35646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
357