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