1 // Copyright 2020 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_CHILD_ACCOUNTS_TIME_LIMITS_WEB_TIME_ACTIVITY_PROVIDER_H_
6 #define CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_WEB_TIME_ACTIVITY_PROVIDER_H_
7 
8 #include <set>
9 
10 #include "base/observer_list.h"
11 #include "base/observer_list_types.h"
12 #include "chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.h"
13 #include "chrome/browser/chromeos/child_accounts/time_limits/web_time_navigation_observer.h"
14 #include "chrome/browser/ui/browser_list_observer.h"
15 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
16 
17 namespace aura {
18 class Window;
19 }  // namespace aura
20 
21 namespace base {
22 class Time;
23 }  // namespace base
24 
25 class Browser;
26 
27 namespace chromeos {
28 namespace app_time {
29 
30 class AppId;
31 class AppTimeController;
32 class AppServiceWrapper;
33 enum class ChromeAppActivityState;
34 
35 class WebTimeActivityProvider : public WebTimeNavigationObserver::EventListener,
36                                 public BrowserListObserver,
37                                 public TabStripModelObserver,
38                                 public AppServiceWrapper::EventListener {
39  public:
40   WebTimeActivityProvider(AppTimeController* app_time_controller,
41                           AppServiceWrapper* app_service_wrapper);
42   WebTimeActivityProvider(const WebTimeActivityProvider&) = delete;
43   WebTimeActivityProvider& operator=(const WebTimeActivityProvider&) = delete;
44 
45   ~WebTimeActivityProvider() override;
46 
47   // WebTimeNavigationObserver::EventListener:
48   void OnWebActivityChanged(
49       const WebTimeNavigationObserver::NavigationInfo& info) override;
50   void WebTimeNavigationObserverDestroyed(
51       WebTimeNavigationObserver* navigation_observer) override;
52 
53   // TabStripModelObserver:
54   void OnTabStripModelChanged(
55       TabStripModel* tab_strip_model,
56       const TabStripModelChange& change,
57       const TabStripSelectionChange& selection) override;
58 
59   // BrowserListObserver:
60   void OnBrowserAdded(Browser* browser) override;
61   void OnBrowserRemoved(Browser* browser) override;
62 
63   // AppServiceWrapper::EventListener:
64   void OnAppActive(const AppId& app_id,
65                    aura::Window* window,
66                    base::Time timestamp) override;
67   void OnAppInactive(const AppId& app_id,
68                      aura::Window* window,
69                      base::Time timestamp) override;
70 
chrome_app_activty_state()71   ChromeAppActivityState chrome_app_activty_state() const {
72     return chrome_app_activity_state_;
73   }
74 
75  private:
76   void TabsInserted(const TabStripModelChange::Insert* insert);
77 
78   // Notifies AppActivityRegistry if there is a change in ChromeAppState.
79   void MaybeNotifyStateChange(base::Time timestamp);
80 
81   // Calculates whether the Chrome app is kActive, kActiveWhitelisted or
82   // kInactive.
83   ChromeAppActivityState CalculateChromeAppActivityState() const;
84 
85   // Reference to AppTimeController. Owned by ChildUserService.
86   AppTimeController* const app_time_controller_;
87 
88   // Reference to AppServiceWrapper. Owned by AppTimeController.
89   AppServiceWrapper* const app_service_wrapper_;
90 
91   // The set of navigation observers |this| instance is listening to.
92   std::set<WebTimeNavigationObserver*> navigation_observers_;
93 
94   // A set of active browser instances.
95   std::set<const Browser*> active_browsers_;
96 
97   // The default chrome app activity state.
98   ChromeAppActivityState chrome_app_activity_state_ =
99       ChromeAppActivityState::kInactive;
100 };
101 
102 }  // namespace app_time
103 }  // namespace chromeos
104 
105 #endif  // CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_WEB_TIME_ACTIVITY_PROVIDER_H_
106