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 17namespace ash { 18namespace test { 19class TraySessionLengthLimitTest; 20} 21 22class LabelTrayView; 23 24// Adds a countdown timer to the system tray if the session length is limited. 25class ASH_EXPORT TraySessionLengthLimit : public SystemTrayItem, 26 public SessionLengthLimitObserver { 27public: 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