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 CHROME_BROWSER_CHROMEOS_LOGIN_DEMO_MODE_DEMO_MODE_DETECTOR_H_
6 #define CHROME_BROWSER_CHROMEOS_LOGIN_DEMO_MODE_DEMO_MODE_DETECTOR_H_
7 
8 #include <memory>
9 #include <string>
10 
11 #include "base/macros.h"
12 #include "base/memory/weak_ptr.h"
13 #include "base/time/tick_clock.h"
14 #include "base/time/time.h"
15 #include "base/timer/timer.h"
16 #include "chrome/browser/chromeos/idle_detector.h"
17 
18 class PrefRegistrySimple;
19 
20 namespace chromeos {
21 
22 // Helper for idle state and demo-mode detection.
23 // Should be initialized on OOBE start.
24 class DemoModeDetector {
25  public:
26   // Interface for notification that device stayed in demo mode long enough
27   // to trigger Demo mode.
28   class Observer {
29    public:
OnShouldStartDemoMode()30     virtual void OnShouldStartDemoMode() {}
31     virtual ~Observer() = default;
32   };
33 
34   DemoModeDetector(const base::TickClock* clock, Observer* observer);
35   virtual ~DemoModeDetector();
36 
37   // Registers the preference for derelict state.
38   static void RegisterPrefs(PrefRegistrySimple* registry);
39 
40   static const base::TimeDelta kDerelictDetectionTimeout;
41   static const base::TimeDelta kDerelictIdleTimeout;
42   static const base::TimeDelta kOobeTimerUpdateInterval;
43 
44  private:
45   void InitDetection();
46   void StartIdleDetection();
47   void StartOobeTimer();
48   void OnIdle();
49   void OnOobeTimerUpdate();
50   void SetupTimeouts();
51   bool IsDerelict();
52 
53   Observer* observer_;
54 
55   // Total time this machine has spent on OOBE.
56   base::TimeDelta time_on_oobe_;
57 
58   std::unique_ptr<IdleDetector> idle_detector_;
59 
60   base::RepeatingTimer oobe_timer_;
61 
62   // Timeout to detect if the machine is in a derelict state.
63   base::TimeDelta derelict_detection_timeout_;
64 
65   // Timeout before showing our demo app if the machine is in a derelict state.
66   base::TimeDelta derelict_idle_timeout_;
67 
68   // Time between updating our total time on oobe.
69   base::TimeDelta oobe_timer_update_interval_;
70 
71   bool demo_launched_ = false;
72 
73   const base::TickClock* tick_clock_;
74 
75   base::WeakPtrFactory<DemoModeDetector> weak_ptr_factory_{this};
76 
77   DISALLOW_COPY_AND_ASSIGN(DemoModeDetector);
78 };
79 
80 }  // namespace chromeos
81 
82 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_DEMO_MODE_DEMO_MODE_DETECTOR_H_
83