1// Copyright (c) 2012 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 CHROME_BROWSER_CHROMEOS_SESSION_LENGTH_LIMITER_H_
6#define CHROME_BROWSER_CHROMEOS_SESSION_LENGTH_LIMITER_H_
7
8#include "base/basictypes.h"
9#include "base/compiler_specific.h"
10#include "base/memory/scoped_ptr.h"
11#include "base/prefs/pref_change_registrar.h"
12#include "base/threading/thread_checker.h"
13#include "base/time/time.h"
14#include "base/timer/timer.h"
15#include "ui/wm/core/user_activity_observer.h"
16
17class PrefService;
18class PrefRegistrySimple;
19
20namespace chromeos {
21
22// Enforces a session length limit by terminating the session when the limit is
23// reached.
24class SessionLengthLimiter : public wm::UserActivityObserver {
25 public:
26  class Delegate {
27   public:
28    virtual ~Delegate();
29
30    virtual const base::TimeTicks GetCurrentTime() const = 0;
31    virtual void StopSession() = 0;
32  };
33
34  // Registers preferences.
35  static void RegisterPrefs(PrefRegistrySimple* registry);
36
37  SessionLengthLimiter(Delegate* delegate, bool browser_restarted);
38  virtual ~SessionLengthLimiter();
39
40  // wm::UserActivityObserver:
41  virtual void OnUserActivity(const ui::Event* event) OVERRIDE;
42
43 private:
44  // Attempt to restore the session start time and the flag indicating user
45  // activity from local state. Return |true| if the restore is successful.
46  bool RestoreStateAfterCrash();
47
48  // Update the session start time if possible:
49  // * If instructed to wait for initial user activity, the session start time
50  //   advances every time this method is called as long as no user activity has
51  //   occurred yet. The time is not persisted in local state.
52  // * If instructed not to wait for initial user activity, the session start
53  //   time is set and persisted in local state the first time this method is
54  //   called.
55  // The pref indicating whether to wait for initial user activity may change at
56  // any time, switching between the two behaviors.
57  void UpdateSessionStartTime();
58
59  void UpdateLimit();
60
61  base::ThreadChecker thread_checker_;
62
63  scoped_ptr<Delegate> delegate_;
64  PrefChangeRegistrar pref_change_registrar_;
65
66  scoped_ptr<base::OneShotTimer<SessionLengthLimiter::Delegate> > timer_;
67  base::TimeTicks session_start_time_;
68  bool user_activity_seen_;
69
70  DISALLOW_COPY_AND_ASSIGN(SessionLengthLimiter);
71};
72
73}  // namespace chromeos
74
75#endif  // CHROME_BROWSER_CHROMEOS_SESSION_LENGTH_LIMITER_H_
76