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