1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef ASH_SYSTEM_CHROMEOS_SESSION_SESSION_LENGTH_LIMIT_H_ 6 #define ASH_SYSTEM_CHROMEOS_SESSION_SESSION_LENGTH_LIMIT_H_ 7 8 #include "ash/system/chromeos/session/session_length_limit_observer.h" 9 #include "ash/system/tray/system_tray_item.h" 10 #include "base/basictypes.h" 11 #include "base/compiler_specific.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "base/strings/string16.h" 14 #include "base/time/time.h" 15 #include "base/timer/timer.h" 16 17 namespace ash { 18 namespace test { 19 class TraySessionLengthLimitTest; 20 } 21 22 class LabelTrayView; 23 24 // Adds a countdown timer to the system tray if the session length is limited. 25 class ASH_EXPORT TraySessionLengthLimit : public SystemTrayItem, 26 public SessionLengthLimitObserver { 27 public: 28 enum LimitState { 29 LIMIT_NONE, 30 LIMIT_SET, 31 LIMIT_EXPIRING_SOON 32 }; 33 34 explicit TraySessionLengthLimit(SystemTray* system_tray); 35 virtual ~TraySessionLengthLimit(); 36 37 // SystemTrayItem: 38 virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE; 39 virtual void DestroyDefaultView() OVERRIDE; 40 41 // SessionLengthLimitObserver: 42 virtual void OnSessionStartTimeChanged() OVERRIDE; 43 virtual void OnSessionLengthLimitChanged() OVERRIDE; 44 45 private: 46 friend class test::TraySessionLengthLimitTest; 47 48 static const char kNotificationId[]; 49 50 // Update state, notification and tray bubble view. Called by the 51 // RepeatingTimer in regular intervals and also by OnSession*Changed(). 52 void Update(); 53 54 // Recalculate |limit_state_| and |remaining_session_time_|. 55 void UpdateState(); 56 57 void UpdateNotification(); 58 void UpdateTrayBubbleView() const; 59 60 // These require that the state has been updated before. 61 base::string16 ComposeNotificationMessage() const; 62 base::string16 ComposeTrayBubbleMessage() const; 63 64 base::TimeTicks session_start_time_; 65 base::TimeDelta time_limit_; 66 base::TimeDelta remaining_session_time_; 67 68 LimitState limit_state_; // Current state. 69 LimitState last_limit_state_; // State of last notification update. 70 71 LabelTrayView* tray_bubble_view_; 72 scoped_ptr<base::RepeatingTimer<TraySessionLengthLimit> > timer_; 73 74 DISALLOW_COPY_AND_ASSIGN(TraySessionLengthLimit); 75 }; 76 77 } // namespace ash 78 79 #endif // ASH_SYSTEM_CHROMEOS_SESSION_SESSION_LENGTH_LIMIT_H_ 80