15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifndef ASH_SYSTEM_CHROMEOS_POWER_TRAY_POWER_H_
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define ASH_SYSTEM_CHROMEOS_POWER_TRAY_POWER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/system/chromeos/power/power_status.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_item.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass Image;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImageSkia;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace message_center {
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass MessageCenter;
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PowerNotificationView;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PowerTrayView;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ASH_EXPORT TrayPower : public SystemTrayItem,
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             public PowerStatus::Observer {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Visible for testing.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum NotificationState {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTIFICATION_NONE,
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Low battery charge.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTIFICATION_LOW_POWER,
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Critically low battery charge.
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    NOTIFICATION_CRITICAL,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Time-based notification thresholds when on battery power.
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static const int kCriticalMinutes;
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static const int kLowPowerMinutes;
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static const int kNoWarningMinutes;
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Percentage-based notification thresholds when using a low-power charger.
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static const int kCriticalPercentage;
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static const int kLowPowerPercentage;
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static const int kNoWarningPercentage;
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TrayPower(SystemTray* system_tray,
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            message_center::MessageCenter* message_center);
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~TrayPower();
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  friend class TrayPowerTest;
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This enum is used for histogram. The existing values should not be removed,
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // and the new values should be added just before CHARGER_TYPE_COUNT.
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  enum ChargerType{
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UNKNOWN_CHARGER,
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MAINS_CHARGER,
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    USB_CHARGER,
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UNCONFIRMED_SPRING_CHARGER,
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SAFE_SPRING_CHARGER,
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHARGER_TYPE_COUNT,
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from SystemTrayItem.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::View* CreateNotificationView(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user::LoginStatus status) OVERRIDE;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DestroyTrayView() OVERRIDE;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DestroyDefaultView() OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DestroyNotificationView() OVERRIDE;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateAfterLoginStatusChange(user::LoginStatus status) OVERRIDE;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateAfterShelfAlignmentChange(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShelfAlignment alignment) OVERRIDE;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Overridden from PowerStatus::Observer.
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnPowerStatusChanged() OVERRIDE;
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Show a notification that a low-power USB charger has been connected.
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns true if a notification was shown or explicitly hidden.
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool MaybeShowUsbChargerNotification();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets |notification_state_|. Returns true if a notification should be shown.
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool UpdateNotificationState();
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool UpdateNotificationStateForRemainingTime();
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool UpdateNotificationStateForRemainingPercentage();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Records the charger type in UMA.
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void RecordChargerType();
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  message_center::MessageCenter* message_center_;  // Not owned.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray::PowerTrayView* power_tray_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray::PowerNotificationView* notification_view_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationState notification_state_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Was a USB charger connected the last time OnPowerStatusChanged() was
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // called?
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool usb_charger_was_connected_;
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Was line power connected the last time onPowerStatusChanged() was called?
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool line_power_was_connected_;
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TrayPower);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // ASH_SYSTEM_CHROMEOS_POWER_TRAY_POWER_H_
115